在平常访问服务器里面的资源的时候,我们通常是通过浏览器输入网址(或者在浏览器点击某个连接)这种方式,如发出Ajax等异步请求,对于目前大多数的前后端分离项目则是通过访问浏览器到前端服务器再到后端服务器。
像这样:
有没有一种使用场景,是需要服务器去发出请求的?即通过编码的方式发出请求,获取资源或者是服务?
答案是有,而且非常多,人的精力是有限的,项目的功能也是有限的,有些功能不是开发的重点,则借助第三方的服务可以省时省力,降低开发难度。
常见的应用场景如下:
HttpClient技术就实现了这样的功能,即让服务器去发出请求,获取外部资源或者是服务
HttpClient技术的实现非常方便,大致步骤如下:
导入Maven坐标:
<dependency>
<groupId>org.apache.httpcomponentsgroupId>
<artifactId>httpclientartifactId>
<version>4.5.13version>
dependency>
获取HttpClient对象
根据请求的方式,创建对应的请求对象,如HttpGet\HttpPost
设置路径参数或者是请求体参数(如果是请求体参数,则需要这是请求的编码方式和数据格式)
处理返回对象
关闭资源
服务器发送Get请求:
这里是请求了项目中的一个Get接口,请求成功会放回一个Integer类型的数据,即1或0
@Test
void testGet() throws IOException {
//获取HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建请求对象
String url = "http://localhost:8080/user/shop/status";
HttpGet httpGet = new HttpGet(url);
//发送请求,接受返回结果
CloseableHttpResponse response = httpClient.execute(httpGet);
//----处理返回结果
//获取服务端返回的状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("服务端返回的状态码为:"+statusCode);
//获取服务端返回的数据
HttpEntity entity = response.getEntity();
//对HttpEntity对象进行解析(字符串)
String body = EntityUtils.toString(entity);
System.out.println(body);
//关闭资源
response.close();
httpClient.close();
}
服务器发送Post请求:
这里是向项目发送了一个登录请求,请求方式是Post,通过请求体携带参数(账号和密码),返回的数据是一个jwt令牌,注意这里要设置请求的编码方式和请求体的数据格式,、。
@Test
void testPost() throws Exception {
//获取httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//url地址
String url = "http://localhost:8080/admin/employee/login";
//获取HttpPost对象
HttpPost httpPost = new HttpPost(url);
//模拟请求体数据--数据格式为json
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", "admin");
jsonObject.put("password", "123456");
//设置请求体参数对象-这里HttpEntity的实现类-StringEntity
StringEntity stringEntity = new StringEntity(jsonObject.toJSONString());
httpPost.setEntity(stringEntity);
//设置请求编码格式
stringEntity.setContentEncoding("utf-8");
//设置请求体数据格式
stringEntity.setContentType("application/json");
//发送post请求
CloseableHttpResponse response = httpClient.execute(httpPost);
//获取返回数据
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("状态响应码:" + statusCode);
HttpEntity entity = response.getEntity();
//将返回的实体类解析为字符串
String resultData = EntityUtils.toString(entity);
System.out.println("返回数据:" + resultData);
//关闭资源
response.close();
httpClient.close();
}