需求
更高級的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();