Android 에서 OkHttp 사용 설명서

7090 단어 Android 핵심
OkHttp 사용 설명서
간단 한 소개
OkHttp 는 Square 에서 나 온 Http 통신 라 이브 러 리 로 HTTP 와 HTTP/2 를 지원 하 며 Android 애플 리 케 이 션 과 자바 애플 리 케 이 션 에 사용 된다.
OkHttp 는 매우 우수한 Http 통신 라 이브 러 리 로 Http 연결 에 있 는 여러 가지 번 거 로 운 문제,병발 에 대한 지원,흔 한 이상 처리 등 을 밑바닥 에 봉 하여 간단 하고 사용 하기 쉬 운 API 공급 용 호출 을 제공 합 니 다.이에 비해 HttpUrlConnection 의 사용 은 너무 복잡 하 다.아파 치 의 HttpClient 는 안 드 로 이 드 플랫폼 에서 실행 되 는 데 여러 가지 문제 가 있다.안 드 로 이 드 6.0 이후 HttpClient 라 이브 러 리 를 SDK 에서 삭제 하고 OkHttp 를 사용 하 는 것 으로 전면 전환 했다.
현재 많은 유명한 안 드 로 이 드 3 자 프레임 워 크 는 OkHttp 를 네트워크 연결 의 기본 스 택 으로 사용 하고 있다.예 를 들 어 Volley,Glide,Retrofit 등 도 OkHttp 학습 의 필요 성 을 알 수 있다.
기본 사용
항목 에 OkHttp 의존 도 추가
OkHttp 모듈 을 사용 해 야 하 는 build.gradle 파일 에 다음 과 같은 의존 도 를 추가 합 니 다.(버 전 번호 변경 가능)
compile 'com.squareup.okhttp3:okhttp:3.2.0'

초기 화
OkHttp 프레임 워 크 의 핵심 클래스 는 OkHttpClient 로 직접 예화 할 수 있 습 니 다.OkHttpClient 내부 에서 동시 다발,다 중 스 레 드,Socket 재 활용 등 문 제 를 처 리 했 기 때문에 자원 을 절약 하기 위해 전체 응용 프로그램 에서 OkHttpClient 대상 을 사용 하면 됩 니 다.Singleton 패 키 징 을 할 수 있 습 니 다.
OkHttpClient okHttpClient = new OkHttpClient();

OkHttp 가 요청 한 구축
Http 요청 을 대표 하 는 클래스 는 Request 입 니 다.이 클래스 는 구조 기 모드 를 사용 합 니 다.가장 간단 한 구조 GET 요청 은 다음 과 같 습 니 다.
Request request = new Request.Builder()
      .url(url)
      .build();

Post 요청 을 구성 하려 면 Request 를 구축 할 때 요청 체 를 추가 하면 됩 니 다.
Request request = new Request.Builder()
    .url(url)
    .post(RequestBody)
    .build();

RequestBody formBody = new FormEncodingBuilder()
    .add("name", "Cuber")
    .add("age", "26")
    .build();

OkHttp 요청 발송
요청 한 전송 은 두 가지 형식 이 있 습 니 다.하 나 는 직접 동기 화하 고 호출 스 레 드 를 막 으 며 결 과 를 직접 되 돌려 주 는 것 입 니 다.다른 하 나 는 대기 열 을 통 해 비동기 로 실행 되 며 호출 스 레 드 를 막 지 않 고 리 셋 방법 으로 결 과 를 되 돌려 주 는 것 이다.다음 과 같다.
동기 화 실행:
//     null,           
Response response = client.newCall(request).execute();

비동기 반전:
Response response = client.newCall(request).enqueue(new Callback() {

    @Override
    public void onFailure(Request request, IOException e) {
        //         
        //  :       !
    }

    @Override
        public void onResponse(Response response) throws IOException {
        //  
        //  :       !
    }
});

이상 은 빠 른 속도 로 OkHttp 가 알 아야 할 모든 내용 입 니 다.이 를 통 해 알 수 있 듯 이 API 는 매우 간단 하고 사용 하기 쉽 습 니 다.
콜 모델
Http 클 라 이언 트 의 임 무 는 요청 과 응답 을 처리 하 는 것 입 니 다.이것 은 말 하기는 간단 하지만 실제 과정 은 매우 복잡 합 니 다.
요청:Http 요청 에는 URL,요청 방법(예:GET 또는 POST),요청 헤더 가 포함 되 어 있 습 니 다.요청 체 를 포함 할 수도 있 고 데이터 흐름 일 수도 있 고 지정 한 콘 텐 츠 분류 일 수도 있 습 니 다
응답:요청 에 응답 코드 로 응답 합 니 다(예 를 들 어 200 은 성공 을 의미 하고 404 는 페이지 를 찾 을 수 없습니다).응답 헤드 와 응답 체 입 니 다
요청 한 재 작성
정확성 과 전송 효율 을 확보 하기 위해 OkHttp 는 요청 을 보 내기 전에 다시 씁 니 다.예 를 들 어OkHttp 는 원본 요청 에 없 는 헤더 정 보 를 추가 할 수 있 습 니 다.Content-Length,Transfer-Encoding,User-agent,Host,Connection,Content-type 을 포함 합 니 다
투명 한 응답 압축(transparent response compression)을 실현 하기 위해 OkHttp 는 Accept-Encoding 헤드 정 보 를 추가 합 니 다
쿠키 를 받 으 면 OkHttp 는 쿠키 헤드 정 보 를 추가 합 니 다
일부 요청 은 응답 에 캐 시 를 할 수 있 습 니 다.캐 시 된 응답 이 최신 이 아니라면,OkHttp 는 업 데 이 트 된 응답 을 다운로드 할 수 있 는 조건 부 GET 요청 을 할 수 있 습 니 다.이 기능 은 If-Modified-Since 와 If-None-Match 등 헤더 정 보 를 추가 해 야 합 니 다
응답 재 작성
투명 압축 을 사용 하면 OkHttp 는 응답 하 는 Content-Encoding 과 Content-Length 헤더 정 보 를 제거 합 니 다.압축 해제 후의 응답 체 에 적용 할 수 없 기 때 문 입 니 다.
조건 부 GET 가 성공 하면 네트워크 측면의 응답 과 캐 시 응답 이 자동 으로 합 쳐 집 니 다.
방향 을 바꾸다
요청 한 URL 이 이동 되면 서버 는 302 와 같은 응답 코드 를 되 돌려 새로운 URL 을 가 리 킵 니 다.OkHttp 는 새로운 URL 을 따라 최종 응답 을 얻 을 수 있 습 니 다.
요청 한 재 시도
연결 실패 가 발생 할 수 있 습 니 다.네트워크 연결 상태 가 좋 지 않 거나 서버 가 접근 할 수 없 을 수도 있 습 니 다.OkHttp 는 자동 으로 다른 경로 로 요청 을 다시 시도 합 니 다.
콜 모델
이상 의 재 작성,재 설정,재 시도 등 작업 으로 인해 간단 한 요청 이 여러 요청 과 응답 을 할 수 있 습 니 다.OkHttp 는 Call 이라는 개념 을 사용 하여 모델 링 을 합 니 다.당신 의 요청 임 무 를 만족 시 키 기 위해 중간 에 몇 번 의 요청 과 응답 을 했 든 하나의 Call 이 라 고 할 수 있 습 니 다.
Call 은 두 가지 방식 으로 실 행 됩 니 다.
동기 화 방식:당신 의 스 레 드 가 막 힐 것 입 니 다.응답 을 읽 을 수 있 음 을 알 고 있 습 니 다
비동기 방식:임의의 스 레 드 에서 줄 을 서 라 고 요청 합 니 다.읽 을 수 있 을 때 다른 스 레 드 에서 리 셋 을 받 습 니 다
Call 의 취소
실행 중인 요청 을 중단 하려 면 Call.cancel()을 사용 하 십시오.스 레 드 가 요청 이나 읽 기 응답 을 쓰 고 있다 면 IOException 을 받 을 수 있 습 니 다.이 방법 을 사용 하면 콜 이 필요 하지 않 을 때 취소 하면 네트워크 트 래 픽 을 절약 할 수 있 습 니 다.
Call 은 임의의 스 레 드 에서 취소 할 수 있 습 니 다.요청 이 완료 되 지 않 으 면 취소 방법 을 호출 하 는 데 실패 할 수 있 습 니 다.요청 체 와 응답 체 의 코드 를 읽 고 쓰 면 IOException 이 발생 합 니 다.
차단기
OkHttp 는 요청 응답 과정 에서 차단기,차단 요청 과 응답 데이터 등 을 추가 할 수 있 습 니 다.
더욱 의존 해 야 한다
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

사용법
차단 기 를 초기 화하 고 차단 단 계 를 설정 하여 OkHttpClient 에 추가 합 니 다.
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

okHttpClient = new OkHttpClient.Builder()
        .addInterceptor(interceptor)
        .build();

응답 체 분석-Gson 사용
의존 도 를 높이다
compile 'com.google.code.gson:gson:2.8.0'

다음 코드 는 서버 응답 JSON 정 보 를 Gson 라 이브 러 리 로 분석 합 니 다.
FAQ
OkHttp 시간 초과 설정 은 어떻게 합 니까?
시간 초과 설정 방법 은 간단 합 니 다:
OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)  //     
    .writeTimeout(10, TimeUnit.SECONDS)    // Socket   
    .readTimeout(30, TimeUnit.SECONDS)     // Socket   
    .build();

readTimeout 과 writeTimeout 은 OkHttp 내부 의 Connection 클래스 에 사용 되 며,setSoTimeout 방법 으로 Socket 을 설정 합 니 다.
또한 2.5.0 버 전 이후 읽 기,쓰기,연결 시간 초과 의 기본 값 은 10s 입 니 다.
OkHttp 에서 Callback 의 리 셋 방법 onFailure 와 onResponse 는 메 인 스 레 드 에서 실행 되 는 코드 입 니까?
아 닙 니 다.OkHttp 는 자바 라 이브 러 리 입 니 다.안 드 로 이 드 라 이브 러 리 가 아 닙 니 다.안 드 로 이 드 메 인 스 레 드 에 대해 아무것도 모 르 기 때문에 이 두 가지 리 셋 방법 은 당연히 배경 스 레 드 에서 실 행 됩 니 다.실제 개발 에 서 는 OkHttp 에 대해 2 차 패 키 징 을 하여 결 과 를 메 인 스 레 드 에 직접 전달 합 니 다.
Callback 클래스 도 실현 할 수 있 습 니 다.추상 적 인 UICallback 을 만들어 UI 에서 실행 할 수 있 습 니 다.
public abstract class UICallback implements Callback{

    private final Handler handler = new Handler(Looper.getMainLooper());

    @Override
    public void onFailure(final Call call, final IOException e) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                onFailureInUi(call, e);
            }
        });
    }

    @Override
    public void onResponse(final Call call, final Response response)  {

        try {
            if (!response.isSuccessful()) {
                throw new IOException("error code: " + response.code());
            }

            final String content = response.body().string();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    onResponseInUi(call, content);
                }
            });
        } catch (IOException e) {
            onFailure(call, e);
        }
    }

    public abstract void onFailureInUi(Call call, IOException e);

    public abstract void onResponseInUi(Call call, String body);
}

좋은 웹페이지 즐겨찾기