OKhttpの簡単な使用

11289 ワード

簡単にokhttpを勉強する理由を説明します
GoogleはAndroid 6.0でHttpClientのApiを削除し、okhttp を採用した.
HTTPを効率的に使用することにより、アプリケーションの実行がより速く、より省トラフィックであるキャッシュデータに応答する重複ネットワーク要求を回避する.
シームレスにGZIPをサポートし、データ流量を削減する.
非常に簡単な使用、要求と応答のApiはスムーズな構築と不変性を持ち、同時に同期非同期呼び出しコールバック関数をサポートする.
ネットワークに問題が発生すると、一般的な接続の問題からにリカバリされます.
サーバが複数のIPアドレスを構成する場合、最初のIP接続が失敗すると、次のIP に接続しようとする.
以上はokhttp公式サイトですhttp://square.github.io/okhttp/ネット上のいくつかの理解を結びつけて整理したものや、間違っているところを見たら指摘してください.
次はokhttpの使い方を学びましょう
環境の設定
githubアドレス:https://github.com/square/okhttp
builde.gradleに追加
compile 'com.squareup.okhttp3:okhttp:3.4.1'

AndroidManifest.xmlに必要な権限を追加
name="android.permission.INTERNET" />

きほんしよう
get非同期要求getリクエストで指定されたURLページリクエストを取得しますが、ここで注意したいのはAndroid 4.0以降は非プライマリスレッドで使用する必要があることです.
private OkHttpClient client = new OkHttpClient();
public static void get(){
        //    Request
        Request request = new Request.Builder()
                .url("http://www.jianshu.com/")
                .get()
                .build();
        //      ,     
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
                //      
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                //      
                Log.e("okHttp","get="+response.body().string());
            }
        });
    }

post非同期要求
    private OkHttpClient client = new OkHttpClient();
    public static void post(){
        //  Form    ,  add     
        FormBody formBody = new FormBody.Builder()
                .add("param","value")
                .add("param","value")
                .build();
        //    Request
        Request request = new Request.Builder()
                .url("http://www.jianshu.com/")
                .post(formBody)
                .build();
        //      ,     
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                Log.e("okHttp","post="+response.body().string());
            }
        });
    }

同期要求client.newCall(request).enqueue(new Callback())client.newCall(request).execute().body().string()に変更すればよい
ファイルアップロードとマルチファイルアップロード
    public static void upload(){
        //      
        List<File> list = new ArrayList<>();
        MultipartBody.Builder builder = new MultipartBody.Builder();
        //       
        builder.setType(MultipartBody.FORM);
        //      
        builder.addFormDataPart("param","value");
        for (File file : list) {
            //      
            RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
            builder.addFormDataPart("files", file.getName(), fileBody);
        }
        Request request = new Request.Builder()
                .url("http://192.168.1.8/upload/UploadServlet")
                .post(builder.build())
                .build();
        //      ,     
        mOkHttpClient.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call,IOException e){
            }
            @Override
            public void onResponse(Call call,Response response) throws IOException{
                Log.e("okHttp","updLoad="+response.body().string());
            }
        });
    }

タイムアウトの設定は、このmOkHttpClientオブジェクトを使用する必要があります.
    public static void setTimeout(){
        mOkHttpClient.newBuilder()
                .connectTimeout(10, TimeUnit.SECONDS)//10     
                .writeTimeout(10, TimeUnit.SECONDS)//10m     
                .readTimeout(10, TimeUnit.SECONDS)//10     
                .build();
    }

ファイルのダウンロードは実は簡単で、get同期や非同期要求を利用してclient.newCall(request).execute().body().byteStream()でInputStream入力ストリームを取得し、ファイルを書く操作でファイルのダウンロードを実現することができます.