Writing in the front
Why did I write this article, because I had a chat with a friend
use
HttpClient and OkHttp are commonly used to invoke other services. Generally, the interfaces exposed by these services are HTTP. HTTP request types are GET, PUT, POST, and DELETE
Introduction to using HttpClient
Sending a request using HttpClient consists of the following steps:
- Create a CloseableHttpClient object or a CloseableHttpAsyncClient object, the former synchronous and the latter asynchronous
- Create the Http request object
- Call the execute method to execute the request. Call the start method before executing the asynchronous request
Create a connection:
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
Copy the code
The connection is synchronous
GET request:
@Test
public void testGet() throws IOException {
String api = "/api/files/1";
String url = String.format("%s%s", BASE_URL, api);
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(httpGet);
System.out.println(EntityUtils.toString(response.getEntity()));
}
Copy the code
Use HttpGet to indicate that the connection is a GET request, and HttpClient invokes the execute method to send the GET request
PUT request:
@Test
public void testPut() throws IOException {
String api = "/api/user";
String url = String.format("%s%s", BASE_URL, api);
HttpPut httpPut = new HttpPut(url);
UserVO userVO = UserVO.builder().name("h2t").id(16L).build();
httpPut.setHeader("Content-Type"."application/json; charset=utf8");
httpPut.setEntity(new StringEntity(JSONObject.toJSONString(userVO), "UTF-8"));
CloseableHttpResponse response = httpClient.execute(httpPut);
System.out.println(EntityUtils.toString(response.getEntity()));
}
Copy the code
POST request:
- Add the object
@Test public void testPost() throws IOException { String api = "/api/user"; String url = String.format("%s%s", BASE_URL, api); HttpPost httpPost = new HttpPost(url); UserVO userVO = UserVO.builder().name("h2t2").build(); httpPost.setHeader("Content-Type"."application/json; charset=utf8"); httpPost.setEntity(new StringEntity(JSONObject.toJSONString(userVO), "UTF-8")); CloseableHttpResponse response = httpClient.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity())); } Copy the code
The request is a request to create an object that requires passing in a JSON string
- Upload a file
@Test public void testUpload1() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); HttpPost httpPost = new HttpPost(url); File file = new File("C: / Users/hetiantian/Desktop/studying/docker_practice. PDF." "); FileBody fileBody = new FileBody(file); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("file", fileBody); //addPart upload file HttpEntity entity = builder.build(); httpPost.setEntity(entity); CloseableHttpResponse response = httpClient.execute(httpPost); System.out.println(EntityUtils.toString(response.getEntity())); }Copy the code
Upload files through addPart
The DELETE request:
@Test
public void testDelete() throws IOException {
String api = "/api/user/12";
String url = String.format("%s%s", BASE_URL, api);
HttpDelete httpDelete = new HttpDelete(url);
CloseableHttpResponse response = httpClient.execute(httpDelete);
System.out.println(EntityUtils.toString(response.getEntity()));
}
Copy the code
Cancellation of request:
@Test
public void testCancel() throws IOException {
String api = "/api/files/1";
String url = String.format("%s%s", BASE_URL, api); HttpGet httpGet = new HttpGet(url); httpGet.setConfig(requestConfig); Long begin = System.currentTimemillis (); CloseableHttpResponse response = httpClient.execute(httpGet);while (true) {
if (System.currentTimeMillis() - begin > 1000) {
httpGet.abort();
System.out.println("task canceled");
break;
}
}
System.out.println(EntityUtils.toString(response.getEntity()));
}
Copy the code
Call abort to cancel the request
task canceled
cost 8098 msc
Disconnected from the target VM, address: '127.0.0.1:60549', transport: 'socket'java.net.SocketException: socket closed... 【 omit 】Copy the code
OkHttp use
Sending a request using OkHttp consists of the following steps:
- Create the OkHttpClient object
- Creating a Request object
- Encapsulate the Request object as a Call
- Call is used to execute synchronous or asynchronous requests, execute method is called to execute synchronously, and enQueue method is called to execute asynchronously
Create a connection:
private OkHttpClient client = new OkHttpClient();
Copy the code
GET request:
@Test
public void testGet() throws IOException {
String api = "/api/files/1";
String url = String.format("%s%s", BASE_URL, api);
Request request = new Request.Builder()
.url(url)
.get()
.build();
final Call call = client.newCall(request);
Response response = call.execute();
System.out.println(response.body().string());
}
Copy the code
PUT request:
@Test
public void testPut() throws IOException {
String api = "/api/user";
String url = String.format("%s%s", BASE_URL, api); UserVO UserVO = uservo.builder ().name()"h2t").id(11L).build();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),
JSONObject.toJSONString(userVO));
Request request = new Request.Builder()
.url(url)
.put(requestBody)
.build();
final Call call = client.newCall(request);
Response response = call.execute();
System.out.println(response.body().string());
}
Copy the code
POST request:
-
Add the object
@Test public void testPost() throws IOException { String api = "/api/user"; String url = String.format("%s%s", BASE_URL, api); // JSONObject json = new JSONObject(); json.put("name"."hetiantian"); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), String.valueOf(json)); Request Request = new request.builder ().url(url).post(requestBody) // Post request.build (); final Call call = client.newCall(request); Response response = call.execute(); System.out.println(response.body().string()); }Copy the code
-
Upload a file
@Test public void testUpload() throws IOException { String api = "/api/files/1"; String url = String.format("%s%s", BASE_URL, api); RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file"."docker_practice.pdf", RequestBody.create(MediaType.parse("multipart/form-data"), new File("C: / Users/hetiantian/Desktop/studying/docker_practice. PDF." "))) .build(); Request Request = new request.builder ().url(url).post(requestBody) // Default is GET Request, can not write.build(); final Call call = client.newCall(request); Response response = call.execute(); System.out.println(response.body().string()); }Copy the code
The addFormDataPart method simulates form uploading
The DELETE request:
@Test
public void testDelete() throws IOException {
String url = String.format("%s%s", BASE_URL, api); Request Request = new request.builder ().url(url).delete().build(); final Call call = client.newCall(request); Response response = call.execute(); System.out.println(response.body().string()); }Copy the code
Cancellation of request:
@Test
public void testCancelSysnc() throws IOException {
String api = "/api/files/1";
String url = String.format("%s%s", BASE_URL, api); Request request = new Request.Builder() .url(url) .get() .build(); final Call call = client.newCall(request); Response response = call.execute(); long start = System.currentTimeMillis(); // Test connection cancellationwhile (true) {// Cancel the request without a result in 1 minuteif (System.currentTimeMillis() - start > 1000) {
call.cancel();
System.out.println("task canceled");
break;
}
}
System.out.println(response.body().string());
}
Copy the code
Call the cancel method to cancel the test
task canceled cost 9110 msc java.net.SocketException: socket closed... 【 omit 】Copy the code
summary
- OkHttp uses build mode to create objects more succinctly, and uses.post/.delete/.put/.get methods to represent request types, rather than HttpClient creating HttpGet, HttpPost, etc
- If HttpClient needs to send asynchronous requests and upload files, it needs to introduce additional asynchronous request dependencies
<! File upload - - > < the dependency > < groupId > org). Apache httpcomponents < / groupId > < artifactId > httpmime < / artifactId > The < version > 4.5.3 < / version > < / dependency > <! - an asynchronous request - > < the dependency > < groupId > org). Apache httpcomponents < / groupId > < artifactId > httpasyncclient < / artifactId > The < version > 4.5.3 < / version > < / dependency >Copy the code
- The HttpClient abort method and the OkHttp cancel method are both fairly simple. If an asynchronous client is used, call the cancellation method when an exception is thrown
timeout
HttpClient Timeout Settings: In HttpClient4.3+ and later, timeout Settings are set using RequestConfig
private CloseableHttpClient httpClient = HttpClientBuilder.create().build();
private RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(60 * 1000)
.setConnectTimeout(60 * 1000).build();
String api = "/api/files/1";
String url = String.format("%s%s", BASE_URL, api); HttpGet httpGet = new HttpGet(url); httpGet.setConfig(requestConfig); // Set the timeout periodCopy the code
The timeout is set on the request type HttpGet, not HttpClient
OkHttp timeout Settings: Set directly on OkHttp
private OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60, Timeunit.seconds)// set the connection timeout time. readTimeout(60, timeunit.seconds)// set the readTimeout time. build();Copy the code
Summary: If client is singleton mode, HttpClient is more flexible in setting timeout, for different request types set different timeout times, OkHttp once set timeout times, all request types are determined
HttpClient and OkHttp performance comparison
Test environment:
- CPU six nuclear
- 8 g memory
- windows10
Each test case is tested five times, without chance
The client connection is a singleton:
The client connection is not singleton:
conclusion
OkHttp and HttpClient are on a par in terms of performance and usage
Thumb up!