Retrofit 2 학습 노트 - 1
Retrofit 는 안 드 로 이 드 와 자바 에 사용 되 는 유형의 안전 한 HTTP 클 라 이언 트 로 네트워크 요청 을 인터페이스 로 밀봉 하고 주석 형식 으로 요청 을 설명 하 며 Retrofit 에서 자동 으로 인 터 페 이 스 를 생 성하 여 개발 자 에 게 호출 합 니 다.
Retofit 2 의 입문
compile 'com.squareup.retrofit2:retrofit:2.1.0'
Maven 인용
com.squareup.retrofit2
retrofit
2.1.0
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://wthrcdn.etouch.cn/").build();
Retrofit 2 인 스 턴 스 를 만 들 때 Retrofit. Builder 방법 을 사용 하고 baseUrl 방법 으로 루트 URL 을 설정 해 야 합 니 다.Retrofit 2 의 baseUlr 는 / 로 끝내 야 합 니 다. 그렇지 않 으 면 Illegal Argument Exception 을 던 집 니 다.
/** * */
public interface WeatherService {
@GET("weather_mini")
Call getWeatherInfo(@Query("city") String city);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://wthrcdn.etouch.cn/")
.addConverterFactory(GsonConverterFactory.create(gson))// ,
.build();
WeatherService service = retrofit.create(WeatherService.class);
Call call1 = service.getWeatherInfo(" ");
//
call1.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
Log.d("Retrofit2Example", response.body().getDesc());
}
@Override
public void onFailure(Call call, Throwable t) {
Log.d("Retrofit2Example", t.getMessage());
}});
try {
//
Response response = call1.execute();
if (response.isSuccessful()) {
Log.d("Retrofit2Example", response.body().getDesc());
}
} catch (IOException e) {
e.printStackTrace();
}
이상 은 매우 간단 한 GET 요청 입 니 다. Retrofit 2
create()
방법 으로 네트워크 인 터 페 이 스 를 생 성 하 는 실현 대상 을 볼 수 있 습 니 다. 그 다음 에 구체 적 인 인터페이스 호출 방법 을 사용 하면 요청 에 대응 하 는 Call
대상 을 생 성 할 수 있 습 니 다. 이때 요청 이 전송 되 지 않 았 습 니 다. 그 다음 에 호출 Call
대상 enqueue
또는 execute
방법 은 비동기 와 동기 화 된 네트워크 요청 을 실현 합 니 다.Retrofit retrofit = new Retrofit.Builder().baseUrl("http://wthrcdn.etouch.cn/").build();
Retrofit.Builder().build()
이 방법 으로 Retrofit 2 대상 을 만 들 수 있 습 니 다. 만 들 때 baseUrl()
방법 으로 Retrofit 2 대상 에 게 루트 경 로 를 설정 할 수 있 습 니 다.이것 은 이해 하기 쉽 습 니 다. 그러면 Retrofit 2 대상 이 만 들 때 할 수 있 는 동작 을 다시 소개 하 겠 습 니 다.1. 먼저 컨버터 를 소개 합 니 다. 컨버터 는 말 그대로 서버 를 되 돌려 주 는 것 Response
입 니 다.기본적으로 Retrofit 는 HTTP 응답 체 를 ResponseBody
로 변환 하 는 것 만 지원 합 니 다.예 를 들 어 Gson 으로 해석 하려 면 의존 도 를 추가 하고 addConverterFactory
방법 으로 변환 기 를 설정 해 야 합 니 다.
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://wthrcdn.etouch.cn/")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
위의 코드 는 먼저 gson 대상 을 만 든 다음 retrofit 대상 을 만 들 때 addConverterFactory 방법 으로 변환 기 를 설정 합 니 다.이 설정 을 통 해 우 리 는 다음 요청 에서 범 형 을 사용 하여 요청 체 나 반환 값 으로 사용 할 수 있 습 니 다.
/** * */
public interface WeatherService {
@GET("weather_mini")
Call getWeatherInfo(@Query("city") String city);
}
이 코드 와 같은 반환 값 은 DTO 입 니 다. 이 DTO 내부 코드 를 살 펴 보 겠 습 니 다.
public class WeatherBean {
private String desc;
private int status;
private Data data;
public void setDesc(String desc) {
this.desc = desc;
}
public String getDesc() {
return this.desc;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
public void setData(Data data) {
this.data = data;
}
public Data getData() {
return this.data;
}
}
gson 변환 기 를 설정 하면 서버 에서 되 돌아 오 는 json 형식의 문자열 이 해당 대상 으로 변 환 됩 니 다.물론 변환 기 를 설치 하지 않 았 다 면 이 범 형 은 기본
ResponseBody
입 니 다. /** * */
public interface WeatherService {
@GET("weather_mini")
Call getWeatherInfo(@Query("city") String city);
}
Converter
를 사용자 정의 해 야 합 니 다.public interface Converter {
// F(rom) T(o)
T convert(F value) throws IOException;
// Retrofit Converter
abstract class Factory {
// ResponseBody Converter, null
//
public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
return null;
}
// RequestBody Converter, null,
// Part、PartMap、Body
public Converter, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return null;
}
// Field、FieldMap、Header、Path、Query、QueryMap
// Retrfofit toString
public Converter, String> stringConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
return null;
}
}
}
예 를 들 어 우리 가
Call
에서 Call
로 전환 하 는 컨버터 를 정의 하려 면 해당 하 는 F 와 T 는 각각 ResponseBody
과 String
에 대응 하고 우 리 는 StringConverter
인 터 페 이 스 를 정의 하고 실현 한다 Converter
.public static class StringConverter implements Converter {
public static final StringConverter INSTANCE = new StringConverter();
@Override
public String convert(ResponseBody value)throws IOException {
return value.string();
}
}
Retrofit 에 StringConverter 를 등록 하기 위해 서 는 Factory 가 필요 합 니 다.
public static class StringConverterFactory extends Converter.Factory {
public static final StringConverterFactory INSTANCE = new StringConverterFactory();
public static StringConverterFactory create() {
return INSTANCE;
}
// ResponseBody String ,
@Override
public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if (type == String.class) {
return StringConverter.INSTANCE;
}
// , null
return null;
}
}
자, 그 후에 우 리 는 다시
Retrofit.Builder.addConverterFactory
를 사용 하여 Retrofit 에 우리 StringConverterFactory
를 등록 합 니 다.Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://wthrcdn.etouch.cn/") // Gson Converter
.addConverterFactory(StringConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
여기
addConverterFactory
는 선착순 이 있 는데 여러 개 ConverterFactory
가 같은 유형 을 지원 하면 첫 번 째 만 사용 되 고 GsonConverterFactory
는 지원 여 부 를 판단 하지 않 기 때문에 여기 서 교환 순 서 는 유형 이 일치 하지 않 기 때문에 이상 하 게 던 질 수 있다.현재 반환 값 형식의 일반적인 매개 변 수 는 String
이면 우리 의 StringConverter 에서 처리 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.