应用场景:主要是为了在java代码中去调用第三方的接口。
1.OkHttp
1.1引入okhtpp依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
1.2封装一个请求的方法
private <T> T requestBase(Object object, String tag, Class<T> resultClass) {
T result = null;
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(90, TimeUnit.SECONDS)
.writeTimeout(90, TimeUnit.SECONDS)
.readTimeout(90, TimeUnit.SECONDS)
.build();
okhttp3.MediaType mediaType = okhttp3.MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(object));
Request request = new Request.Builder()
.url("https://www.xxx.xxx./xxx/" + tag).method("POST", body)
.addHeader("Content-Type", "text/plain")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
String originResult = response.body().string();
result = JSON.parseObject(originResult, resultClass);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
其实就两步,构建客户端client,构建请求request,客户端client去调用newCall(request)发起请求
2.RestTemplate
这个是由我们Spring框架中的web依赖提供的,不用额外引入,但需要一个配置类。
2.1 添加配置类RestTemplateConfig
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
RestTemplate restTemplate = new RestTemplate(factory);
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
return restTemplate;
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(180000);
factory.setReadTimeout(180000);
return factory;
}
}
2.2封装一个通用的方法
public <T> T requestBase(Object requestBody, String tag, Class<T> resultClass) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(requestBody, headers);
ResponseEntity<T> response = restTemplate.postForEntity("https://www.xxx.xxx./xxx/" + tag, httpEntity, resultClass);
return response.getBody();
}
写法相对简单一些
总结:上述两种方法没有限制,想使用哪个用哪个,其实实际运用中最好是封装一个工具类。不想自己封装的,上网搜一下,最好还是自己封装,理解更深一些,再搜搜别的稍加补充。