项目加入OkHttp
在build.gradle中加入以下代码,OkHttp最新版本可以在官网查看。
implementation 'com.squareup.okhttp3:okhttp:最新版本'
添加完成之后,进行sync now
,然后,在AndroidManiifest.xml中添加网络权限。
<uses-permission android:name="android.permission.INTERNET"/>
GET请求
步骤
- new OkHttpClient;
- 构造Request对象;
- 通过前两步中的对象构建Call对象;
- 通过Call#enqueue(Callback)方法来提交异步请求;
异步Get
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient(); //获得OkHttpClient对象
final Request request = new Request.Builder() //构造Request对象
.url(url)
.get()//默认就是GET请求,可以不写
.build();
Call call = okHttpClient.newCall(request); 获得Call对象
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
同步Get
同步Get只需要使用Call#execute就可以实现,由于同步的Get是在主线程中进行的,当请求时间过长时,会发生ANR的错误。
因此在android 3.0
之后,直接改成了在主线程中访问网络会引起异常。
android.os.NetworkOnMainThreadException
同步Get需要在子线程中执行。
String url = "https://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.build();
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
Response response = null;
try {
response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
POST请求
使用OkHttp发送POST请求与GET请求类似,不同的是,发送POST请求需要附带一个RequestBody,如果POST请求不是发送表单数据,还需要提供一个MediaType对象指明传输的数据的类型。
发送表单数据
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("name", "echo") //添加表单数据
.build();
Request request = new Request.Builder()
.url("https://en.wikipedia.org/w/index.php")
.post(requestBody) //post方法中传入请求体
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
提交文件
当POST不是传输表单数据时,还需要使用MediaType对象指出传输文件的类型,MediaType接收MIME类型,关于MIME类型可以参考MIME参考手册。
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
OkHttpClient okHttpClient = new OkHttpClient();
File file = new File("test.md"); //取得传输文件
RequestBody requestBody = RequestBody.create(mediaType,file); //通过RequestBody.create方法,使用MediaType对象和File构造RequestBody对象。
Request request = new Request.Builder()
.url("https://www.baidu.com/")
.post(requestBody)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
提交数据流
RequestBody requestBody = new RequestBody() {
@Nullable
@Override
public MediaType contentType() {
return MediaType.parse("text/x-markdown; charset=utf-8"); //指定流的类型
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
sink.writeUtf8("I am Jdqm.");
}
};
Request request = new Request.Builder()
.url("https://www.baidu.com/")
.post(requestBody)
.build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
提交String
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
String requestBody = "I am Jdqm.";
Request request = new Request.Builder()
.url("https://api.github.com/markdown/raw")
.post(RequestBody.create(mediaType, requestBody))
.build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
添加请求头部
在构建Request对象的时候可以添加请求头部。
Request request = new Request.Builder()
.url("https://www.baidu.com/")
.addHeader("key","value") //添加头部。
.post(requestBody)
.build();