跳转至

Android OkHttp3

请求参数

固定添加

RequestBody requestBody = new FormBody.Builder()
            .add("key1", value1)
            .build();

动态添加

FormBody.Builder builder = new FormBody.Builder();
builder.add("key1", value1);

// 根据输入是否为空判断是否传递参数
if (!TextUtils.isEmpty(edittext.getText().toString())) {
    builder.add("key2", edittext.getText().toString());
}

添加文件

MultipartBody.Builder builder = new MultipartBody.Builder();
builder.addFormDataPart("key1", value1);

File file = new File(path);
builder.addFormDataPart("file_key", file.getName(),
                        RequestBody.create(MediaType.parse("application/octet-stream"), file));
//注意 在build前要setType为MultipartBody.FORM 不然会发生媒体类型不正确错误
RequestBody requestBody = builder.setType(MultipartBody.FORM).build();

请求方法

可使用addHeader("key", value)来动态添加Header,若参数动态添加,则使用builder.build()替代requestBody即可。

GET

Request requestGet = new Request.Builder()
        .get()
        .url(getUrl())
        .build();

POST

Request request = new Request.Builder()
                .post(requestBody)
                .addHeader("key", value)
                .url(getUrl())
                .build();

DELETE

    Request request = new Request.Builder()
            .delete()
            .url(getUrl())
            .build();

PUT

Request request = new Request.Builder()
                .put(requestBody)
                .url(getUrl())
                .build();

发起请求

Activity中:

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                showToast("Network failure");
            }
        });
    }

    @Override
    public void onResponse(Call call, final Response response) throws IOException {
        final String data = response.body().string();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                switch (response.code()) {
                    case 200:
                        showToast("Success");
                        break;
                    default:
                        showToast("Network success but this is some logic error");
                        break;
                }
            }
        });
    }
});

Fragment中:

public Handler handler = new Handler(Looper.getMainLooper());

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                showToast("Network failure");
            }
        });
    }

    @Override
    public void onResponse(Call call, final Response response) throws IOException {
        final String data = response.body().string();
        handler.post(new Runnable() {
            @Override
            public void run() {
                switch (response.code()) {
                    case 200:
                        showToast("Success");
                        break;
                    default:
                        showToast("Network success but this is some logic error");
                        break;
                }
            }
        });
    }
});

HttpClient.java:

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


public class HttpClient {
    private static String token = null;
    private static OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(Constants.TTL, TimeUnit.MILLISECONDS)//设置10s钟超时
            .addInterceptor(new Interceptor() {
                //拦截器 用于为每个request添加"Authorization", "Token "+token 信息用于服务器区分合法用户
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    if (token != null) {
                        request = request.newBuilder()
                                .addHeader("Authorization", "Token " + token).build();//验证信息
                    }
                    return chain.proceed(request);
                }
            }).build();

    public static void setToken(String new_token) {
        token = new_token;
    }

    public static String getToken() {
        return token;
    }

    public static OkHttpClient getClient() {
        return client;
    }
}

设置Token:

//为OkHttp的头部添加Token
HttpClient.setToken(access_token);

之后需要使用有该Header的请求直接调用:

HttpClient.getClient().newCall(request).enqueue(new Callback() {....}

不使用有该Header的请求:

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {...}