简介:
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient
HttpClient的请求类型
实现了所有的Http请求类型,相应的类为
HttpGet、HttpPost、HttpDelete、HttpPut
HTTP之状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
最近手上的项目要去调用别人的接口 所以总结了一下
上代码
1.首先是在pom文件导入所需的依赖
<!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
2.创建HttpClient工具类
1.这个工具类有 get 有参无参 和post的有参无参
2.get post 添加请求头 原因是需要把对方给的接口中获取token放到请求头里
token的值可以直接获取 也可以工具类获取
package com.ipcoffee.common.http;
import org.apache.http.Header;
import org.apache.log4j.Logger;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.util.*;
public class HttpClient {
private static Logger logger = Logger.getLogger(HttpClient.class);
//POST 有参无参
public static String sendPOSTRequest(String url, MultiValueMap<String, String> params) {
RestTemplate client = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
// 执行HTTP请求
ResponseEntity<String> response = client.exchange(url, HttpMethod.POST, requestEntity, String.class);
return response.getBody();
}
//GET 有参无参
public static String sendGETRequest(String url, MultiValueMap<String, String> params) {
RestTemplate client = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
// 执行HTTP请求
ResponseEntity<String> response = client.exchange(url, HttpMethod.GET, requestEntity, String.class);
return response.getBody();
}
//POST 有参无参 加请求头
public static String sendPOSTRequest(String url, MultiValueMap<String, String> params, HttpHeaders headers) {
RestTemplate client = new RestTemplate();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
// 执行HTTP请求
ResponseEntity<String> response = client.exchange(url, HttpMethod.POST, requestEntity, String.class);
return response.getBody();
}
//GET 有参无参 加请求头
public static String sendGETRequest(String url, MultiValueMap<String, String> params,HttpHeaders headers) {
RestTemplate client = new RestTemplate();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
// 执行HTTP请求
ResponseEntity<String> response = client.exchange(url, HttpMethod.GET, requestEntity, String.class);
return response.getBody();
}
//获取token
public static String getToken() throws JSONException {
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.put("appKey", Arrays.asList(JournalismUtil.JOURNALISMTOKENAPPKEY));
params.put("secret", Arrays.asList(JournalismUtil.JOURNALISMTOKENSECRET));
String token = HttpClient.sendPOSTRequest(JournalismUtil.JOURNALISMTOKENURL, params);
JSONObject jsonObj = new JSONObject(token);
String Authorization= = jsonObj.getString("token");
return Authorization;
}
}
注意:
获取token
如果一个页面同时 调用多个接口的话 很容易页面和后台报错
报错的原因 就是token的值被覆盖了,因为你每次调用都会生成新的token,
解决token值被覆盖问题
解决token值被覆盖问题见本文章:https://blog.csdn.net/weixin_44520739/article/details/103514819
https://blog.csdn.net/weixin_44520739/article/details/103514819
3调用别人的接口
有参MultiValueMap进行赋值
本人把对方给的路径 和值 封装了一个util包 如果以后要改请求比较方便
我是在方法里直接获取的token 下面有工具类获取的
@RequestMapping("getId")
@ResponseBody
public ActionResult getId(int id) throws BaseException, JSONException{
//获取token
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
//传入生成token的key
params.put("appKey", Arrays.asList(JournalismUtil.JOURNALISMTOKENAPPKEY));
//传入生成token的另外一个值
params.put("secret",Arrays.asList(JournalismUtil.JOURNALISMTOKENSECRET));
//调用别人写的接口 用Post方法获取token这里只是获取token 所以就调用 post 有参无参
//方法就行
String token=HttpClient.sendPOSTRequest(JournalismUtil.JOURNALISMTOKENURL,params);
//返回的json需要解析下 只获取中的token
JSONObject jsonObj = new JSONObject(token);
//获取到token
String Authorization=jsonObj.getString("token");
MultiValueMap<String, String> params1 = new LinkedMultiValueMap<>();
//访问别人的接口路径 以及要传入的参数拼接
String url=JournalismUtil.JOURNALISMNEWSURL+"/"+id;
//设置请求头 把token 和key 放到headers里
HttpHeaders headers=new HttpHeaders();
//设置token
headers.add("Authorization",Authorization);
//设置key
headers.add("AppKey",JournalismUtil.JOURNALISMTOKENAPPKEY);
//调用HttpClient的get方法 因为对方给的就是get代参的方法这里需要设置请求头
//所以调HttpClient的get 有参无参 加请求头 方法
String search=HttpClient.sendGETRequest(url,params1,headers);
return ActionResult.success(search);
}
使用工具类获取token和HttpClient工具类
@RequestMapping("xxxx")
@ResponseBody
public ActionResult getKeywords(String xxx, String xx) throws JSONException {
MultiValueMap<String, String> params1 = new LinkedMultiValueMap<>();
String url = ExpertUtil.EXPERT + orgName + "/" + name + ExpertUtil.EXPERTKEYWORDS;
HttpHeaders headers = new HttpHeaders();
//获取token
String Authorization =HttpClient.getToken();
//设置请求头
headers.add("Authorization", Authorization);
headers.add("AppKey", JournalismUtil.JOURNALISMTOKENAPPKEY);
String keywords = null;
try {
keywords = HttpClient.sendGETRequest(url, params1, headers);
} catch (Exception e) {
//如果有异常 进行处理
//如果是403证明token过期重新获取
if (e.toString().contains("403")){
String Authorizations =HttpClient.getToken();
HttpHeaders headers1 = new HttpHeaders();
headers1.add("Authorization",Authorizations);
headers1.add("AppKey", JournalismUtil.JOURNALISMTOKENAPPKEY);
keywords = HttpClient.sendGETRequest(url, params1, headers1);
return ActionResult.success(keywords);
}
//如果别的异常返回空
return ActionResult.success(null);
}
return ActionResult.success(keywords);
}
测试结果
这篇博客只代表本人的理解与写法,只作为参考,不代表大众 勿喷谢谢!