需求
更高级的HttpUrlConnection/HttpClient
引入:
maven
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.2</version>
</dependency>
gradle
compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.14.2'
API原理:
- OkHttpClient负责发送Request,并返回Response:
OkHttpClient client=new OkHttpClient();
Request request=null; //建造者模式建造Request对象
Response response=client.newCall(request).execute();
- Request对象由建造者模式设置一系列细节:
Request request=new Request.Builder()
.url("https://www.baidu.com")
.header("Content-Type","application/json")
.addHeader("role","admin")
.addHeader("role","manager")
.get() //这是默认项
.build();
- Response的解析技术综合:
Response response=client.newCall(request).execute();
response.code();//状态码
response.header("Cookie");//响应头
response.body().bytes();//原生字节组
response.body().byteStream();//流方式
response.body().string();//字符串形式(原始编码)
异步
//异步调用,开子线程守护网络响应,且响应结束线程存活
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println("失败.....");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println(response.body().string());
System.exit(0);
}
});
System.out.println("结局无需等......");
发送请求体(post,put,patch)
- 使用RequestBody对象:
RequestBody requestBody= RequestBody.create(MediaType,[String|ByteString|byte[]|File])
- 具体示例(json提交):
MediaType JSON= MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON,"{id:1}");
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
- 具体示例(普通表单提交):
RequestBody formBody = new FormBody.Builder()
.add("name", "john")
.build();
Request request = new Request.Builder()
.url("https://en.wikipedia.org/w/index.php")
.post(formBody)
.build();
- 具体示例(文件上传提交):
MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "Square Logo")
.addFormDataPart("image", "logo.png",RequestBody.create(MEDIA_TYPE_PNG,new File("logo.png")))
.build();
Request request = new Request.Builder()
.header("Authorization", "xxxx")
.url("https://api.imgur.com/3/image")
.post(requestBody)
.build();