Android OkHttp3
请求参数
固定添加
动态添加
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
POST
Request request = new Request.Builder()
.post(requestBody)
.addHeader("key", value)
.url(getUrl())
.build();
DELETE
PUT
发起请求
在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;
}
}
});
}
});
全局Header
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:
之后需要使用有该Header的请求直接调用:
不使用有该Header的请求: