简介
OkHttp是一个优秀的Android网络请求框架,可能一说到网络请求框架,可能很多人都会想到volley,volley是一个Google提供的网络请求框架,volley是要依靠HttpCient的,而Google在Android6.0的SDK中去掉了HttpCient,所以OkHttp就开始越来越受大家的欢迎。
网络请求发展
HttpURLConnection—>Apache HTTP Client—>Volley—->okHttp
优点
1、网络优化方面:
(1)利用连接池减少请求延迟,支持连接复用;
(2)支持GZIP压缩;
(3)通过缓存避免重复的请求;
(4)支持http2,对一台机器的所有请求共享同一个socket。
2、功能方面:
功能全面,满足了网络请求的大部分需求
3、扩展性方面:
责任链模式使得很容易添加一个自定义拦截器对请求和返回结果进行处理
原理
源码
废话不多说,举个栗子
1、引入依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.7.2</version>
</dependency>
2、添加HttpClient工具类
public class HttpClient {
OkHttpClient client = new OkHttpClient();
//post请求
public String post(String url, RequestBody body) throws IOException {
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
// 创建一个通信请求
try (Response response = client.newCall(request).execute()) {
// 尝试将返回值转换成字符串并返回
return response.body().string();
}
}
//带header post请求
public String post(String url,Headers headers, RequestBody body) throws IOException {
Request request = new Request.Builder()
.url(url)
.headers(headers)
.post(body)
.build();
// 创建一个通信请求
try (Response response = client.newCall(request).execute()) {
// 尝试将返回值转换成字符串并返回
return response.body().string();
}
}
//get请求
public String get(String url) throws IOException{
Request request = new Request.Builder()
.url(url)
.get()
.build();
// 创建一个通信请求
try (Response response = client.newCall(request).execute()) {
// 尝试将返回值转换成字符串并返回
return response.body().string();
}
}
//设置Header
public Headers SetHeaders(Map<String, String> headersParams) {
Headers headers = null;
okhttp3.Headers.Builder headersbuilder = new okhttp3.Headers.Builder();
if (StringUtils.isNotEmpty(String.valueOf(headersParams))) {
Iterator<String> iterator = headersParams.keySet().iterator();
String key = "";
while (iterator.hasNext()) {
key = iterator.next().toString();
headersbuilder.add(key, headersParams.get(key));
}
}
headers = headersbuilder.build();
return headers;
}
}
3、编写Service接口类:UserService
public interface UserService {
public String getUserById(int id) throws IOException;
public String updateUser(int id, String token, User user) throws IOException;
public String createUser(User user) throws IOException;
}
4、编写实现类:UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
public static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
@Value("${com.http.link:}")
private String httpUrl;
@Override
public String getUserById(int id) throws IOException{
//新建HttpClient对象
HttpClient httpClient = new HttpClient();
//设置url
StringBuffer requestUrl = new StringBuffer();
requestUrl.append(httpUrl).append("/queryUserById/").append(id);
//调用get方法
String response = httpClient.get(requestUrl.toString());
log.info("response: "+response);
//解析返回值
JSONObject responseBody = JSON.parseObject(response);
log.info("responseBody: "+responseBody);
String message = responseBody.getString("message");
log.info("message: "+message);
String user = responseBody.getString("object");
log.info("user: "+user);
return user;
}
@Override
public String updateUser(int id, String token, User user) throws IOException{
//新建HttpClient对象
HttpClient httpClient = new HttpClient();
//设置url
StringBuffer requestUrl = new StringBuffer();
requestUrl.append(httpUrl).append("/updateUser/").append(id);
//设置Request Header
Map<String, String> headMap =new HashMap<>();
headMap.put("token",token);
Headers setHeaders = httpClient.SetHeaders(headMap);
//设置Request Body
RequestBody body = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), JSON.toJSONString(user));
//调用post方法:url+header+body
String response = httpClient.post(requestUrl.toString(),setHeaders,body);
log.info("response: "+response);
//解析返回值
JSONObject responseBody = JSON.parseObject(response);
log.info("responseBody: "+responseBody);
String message = responseBody.getString("message");
log.info("message: "+message);
String object = responseBody.getString("object");
log.info("object: "+object);
return object;
}
@Override
public String createUser(User user) throws IOException{
//新建HttpClient对象
HttpClient httpClient = new HttpClient();
//设置url
StringBuffer requestUrl = new StringBuffer();
requestUrl.append(httpUrl).append("/createUser");
//设置Request Body
RequestBody body = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), JSON.toJSONString(user));
//调用post方法:url+body
String response = httpClient.post(requestUrl.toString(),body);
log.info("response: "+response);
//解析返回值
JSONObject responseBody = JSON.parseObject(response);
log.info("responseBody: "+responseBody);
String message = responseBody.getString("message");
log.info("message: "+message);
String object = responseBody.getString("object");
log.info("object: "+object);
return object;
}
}
5、编写OkHttpController控制类模拟调用:
@Api(tags = "OkHttpController", description = "OkHttp操作接口")
@RestController
@RequestMapping("/okhttp")
public class OkHttpController {
public static final Logger log = LoggerFactory.getLogger(OkHttpController.class);
@Autowired
UserService userService;
@ApiOperation("按员工ID获取员工列表")
@GetMapping("/queryUserById/{id}")
public @ResponseBody
Result queryUserById(@ApiParam(name = "id", value = "用户ID", required = true)
@PathVariable int id) throws IOException {
String user = userService.getUserById(id);
return Result.succResult(user);
}
@ApiOperation("员工修改")
@PostMapping("/updateUser/{id}")
public @ResponseBody
Result updateUserResult(
@ApiParam(value = "用户ID", required = true) @PathVariable Integer id,
@ApiParam(value = "Token", required = true) @RequestHeader String token,
@ApiParam(value = "用户信息", required = true) @RequestBody User user) throws IOException {
String object = userService.updateUser(id,token,user);
return Result.succResult(object);
}
@ApiOperation("员工新增")
@PostMapping("/createUser")
public @ResponseBody
Result createUserResult(@ApiParam(value = "用户信息", required = true) @RequestBody User user) throws IOException {
String object = userService.createUser(user);
return Result.succResult(object);
}
}
6、实现效果:
7、源码地址:
https://gitee.com/qiugantao/java-spring-quick-start
创作不易,你的三连是我最大的写作动力!