Retrofit 2 학습 노트 - 1

Retrofit 2 가 뭐야?
Retrofit 는 안 드 로 이 드 와 자바 에 사용 되 는 유형의 안전 한 HTTP 클 라 이언 트 로 네트워크 요청 을 인터페이스 로 밀봉 하고 주석 형식 으로 요청 을 설명 하 며 Retrofit 에서 자동 으로 인 터 페 이 스 를 생 성하 여 개발 자 에 게 호출 합 니 다.
Retofit 2 의 입문
  • 인용 Retrofit 2 Gradle 인용 compile 'com.squareup.retrofit2:retrofit:2.1.0' Maven 인용
  •   
    com.squareup.retrofit2  
    retrofit  
    2.1.0  
    
    
  • Retrofit 2 입문 다음 에 우 리 는 한 걸음 한 걸음 Retrofit 2 의 사용 을 배운다.
  • Retrofit 2 인 스 턴 스 만 들 기
  • Retrofit retrofit = new Retrofit.Builder().baseUrl("http://wthrcdn.etouch.cn/").build();
    

    Retrofit 2 인 스 턴 스 를 만 들 때 Retrofit. Builder 방법 을 사용 하고 baseUrl 방법 으로 루트 URL 을 설정 해 야 합 니 다.Retrofit 2 의 baseUlr 는 / 로 끝내 야 합 니 다. 그렇지 않 으 면 Illegal Argument Exception 을 던 집 니 다.
  • HTTP API 와 대응 하 는 인 터 페 이 스 를 정의 합 니 다
  •     /** *          */    
    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);
    
  • 동기 화 또는 비동기 식 HTTP 요청
  • 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 2 대상 의 생 성
  • 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 retrofit 자체 변환기:
  • Gson: com.squareup.retrofit2:converter-gson
  • Jackson:com.squareup.retrofit2:converter-jackson
  • Moshi:com.squareup.retrofit2:converter-moshi
  • Protobuf:com.squareup.retrofit2:converter-protobuf
  • Wire:com.squareup.retrofit2:converter-wire
  • Simple XML:com.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, String): com. squareup. retrofit 2: converter - scalars 가 가지 고 있 는 변환기 가 우리 의 수 요 를 만족 시 키 지 못 한다 면 이 럴 때 우 리 는 변환기 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 는 각각 ResponseBodyString 에 대응 하고 우 리 는 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 에서 처리 합 니 다.

    좋은 웹페이지 즐겨찾기