实战HttpClient 接口调用以及获取token 设置请求头
简介:
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();}//获取tokenpublic 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")@ResponseBodypublic ActionResult getId(int id) throws BaseException, JSONException{//获取tokenMultiValueMap<String, String> params = new LinkedMultiValueMap<>();//传入生成token的keyparams.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需要解析下 只获取中的tokenJSONObject jsonObj = new JSONObject(token);//获取到tokenString Authorization=jsonObj.getString("token");MultiValueMap<String, String> params1 = new LinkedMultiValueMap<>();//访问别人的接口路径 以及要传入的参数拼接String url=JournalismUtil.JOURNALISMNEWSURL+"/"+id;//设置请求头 把token 和key 放到headers里HttpHeaders headers=new HttpHeaders();//设置tokenheaders.add("Authorization",Authorization);//设置keyheaders.add("AppKey",JournalismUtil.JOURNALISMTOKENAPPKEY);//调用HttpClient的get方法 因为对方给的就是get代参的方法这里需要设置请求头//所以调HttpClient的get 有参无参 加请求头 方法String search=HttpClient.sendGETRequest(url,params1,headers);return ActionResult.success(search);}
使用工具类获取token和HttpClient工具类
@RequestMapping("xxxx")@ResponseBodypublic 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();//获取tokenString 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);}
测试结果
这篇博客只代表本人的理解与写法,只作为参考,不代表大众 勿喷谢谢!
实战HttpClient 接口调用以及获取token 设置请求头相关推荐
- Jmeter接口实战(一)之获取token值登录
Jmeter接口实战(一)之获取token值登录 第一式:获取token值登录 文章目录 Jmeter接口实战(一)之获取token值登录 前言 一.效果图 二.token是什么 1.token定义 ...
- postman登录获取token,接口header中添加token发送请求
[Postman]登录获取token,接口header中添加token发送请求 说明 开始 说明 该文章只是用于记录,防止自己忘记. 开始 1.准备登录接口 2.添加全局变量 3.添加一个登录接口,登 ...
- 爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常
1 requests requests是Python中实现HTTP请求的一种方式,requests是第三方模块,该模块在实现HTTP请求时要比urlib.urllib3模块简化很多,操作更加人性化. ...
- 爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆
1 urllib模块 1.1 urllib模块简介 Python3中将urib与urllib2模块的功能组合,并且命名为urllib.Python3中的urllib模块中包含多个功能的子模块,具体内容 ...
- FeignClient设置请求头信息
FeignClient设置请求头信息 1. FeignClient概述 2. FeignClient设置请求头信息 2.1 实现方式一 2.2 实现方式二 1. FeignClient概述 这里所说的 ...
- axios设置请求头
背景: 请求后端数据时,接口返回json为空.与后端沟通发现,请求头中缺少 'X-Requested-With': 'XMLHttpRequest' 解决: 1,vue+vant项目中 service ...
- HttpClient4 - 设置请求头
目录 设置请求头 代码演示 设置请求头 HttpClient可以设置请求头,在实际项目中,登录后往往需要将session放置在cookie中, 以供后续接口使用,而cookie正是请求头的一部分. 代 ...
- request设置请求头_收藏 Scrapy框架各组件详细设置
今天说一下Scrapy框架各组件的详细设置. 关于Scrapy Scrapy是纯Python语言实现的爬虫框架,简单.易用.拓展性高是其主要特点.这里不过多介绍Scrapy的基本知识点,主要针对其高拓 ...
- httpservletrequest 设置请求头_请求和常用对象
## 一.主要内容 ![](https://raw.githubusercontent.com/Cushier/picture-java/master/middle/20190712150414.pn ...
最新文章
- [unreal4入门系列之四] 熟悉虚幻4项目浏览器界面
- Android之Debug运行项目一直卡在Debug界面(can‘t bind to local 8066 for debug)
- php漏洞黑掉数据库,WDCPnbsp;add_user.php任意数据库添加任意用户漏洞分析
- spool命令、创建一个表,创建而且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站...
- 山寨版学子商城——成功上线!
- VirtualBox安装增强功能时报错:未能加载虚拟光盘VBoxGuestAdditions.iso 到虚拟电脑
- vue axios ts 封装流文件下载方法
- 大众点评字体_大众点评字体解析
- Python读取excel文件数据并画柱状图
- 计算广告学--笔记(1)
- react hooks子组件向父组件传参
- 2014中秋节,用java为QQ游戏美女找茬写辅助
- 基于时空大数据的GIS技术,推动网格化管理创新发展
- nmap命令小结(一)
- blogger_如何在博客中添加推文并调试基本JavaScript:为什么Twitter.com/JavaScript/Blogger JSONP Widget停止工作?...
- 上大学究竟是来干什么的 为什么会这样
- iPhone 6 图像渲染揭秘
- 微信小程序分销系统有哪些营销模式?看完你就秒懂了!
- KMP算法-next函数介绍
- 车联网解决方案(PPT)
热门文章
- 农夫过河问题(一个有趣的问题-位运算)
- u盘/移动硬盘的视频文件出现损坏怎么办?修复损坏视频办法分享!
- 给出x.509证书的实例并分析其工作方式
- avcodec_receive_frame
- 【Git】git did not exit cleanly (exit code 1) 异常处理
- MySQL-HA高可用
- java 时间轮_基于时间轮的定时任务
- CEOI 2020, Day 2 A,B题解 CF1403A CF1403B
- 三维动画项目实训① ------(3.17-3.24)
- android u盘 uuid,Android4.4KitKat支持u盘功能