简介:

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 设置请求头相关推荐

  1. Jmeter接口实战(一)之获取token值登录

    Jmeter接口实战(一)之获取token值登录 第一式:获取token值登录 文章目录 Jmeter接口实战(一)之获取token值登录 前言 一.效果图 二.token是什么 1.token定义 ...

  2. postman登录获取token,接口header中添加token发送请求

    [Postman]登录获取token,接口header中添加token发送请求 说明 开始 说明 该文章只是用于记录,防止自己忘记. 开始 1.准备登录接口 2.添加全局变量 3.添加一个登录接口,登 ...

  3. 爬虫实战学习笔记_6 网络请求request模块:基本请求方式+设置请求头+获取cookies+模拟登陆+会话请求+验证请求+上传文件+超时异常

    1 requests requests是Python中实现HTTP请求的一种方式,requests是第三方模块,该模块在实现HTTP请求时要比urlib.urllib3模块简化很多,操作更加人性化. ...

  4. 爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆

    1 urllib模块 1.1 urllib模块简介 Python3中将urib与urllib2模块的功能组合,并且命名为urllib.Python3中的urllib模块中包含多个功能的子模块,具体内容 ...

  5. FeignClient设置请求头信息

    FeignClient设置请求头信息 1. FeignClient概述 2. FeignClient设置请求头信息 2.1 实现方式一 2.2 实现方式二 1. FeignClient概述 这里所说的 ...

  6. axios设置请求头

    背景: 请求后端数据时,接口返回json为空.与后端沟通发现,请求头中缺少 'X-Requested-With': 'XMLHttpRequest' 解决: 1,vue+vant项目中 service ...

  7. HttpClient4 - 设置请求头

    目录 设置请求头 代码演示 设置请求头 HttpClient可以设置请求头,在实际项目中,登录后往往需要将session放置在cookie中, 以供后续接口使用,而cookie正是请求头的一部分. 代 ...

  8. request设置请求头_收藏 Scrapy框架各组件详细设置

    今天说一下Scrapy框架各组件的详细设置. 关于Scrapy Scrapy是纯Python语言实现的爬虫框架,简单.易用.拓展性高是其主要特点.这里不过多介绍Scrapy的基本知识点,主要针对其高拓 ...

  9. httpservletrequest 设置请求头_请求和常用对象

    ## 一.主要内容 ![](https://raw.githubusercontent.com/Cushier/picture-java/master/middle/20190712150414.pn ...

最新文章

  1. [unreal4入门系列之四] 熟悉虚幻4项目浏览器界面
  2. Android之Debug运行项目一直卡在Debug界面(can‘t bind to local 8066 for debug)
  3. php漏洞黑掉数据库,WDCPnbsp;add_user.php任意数据库添加任意用户漏洞分析
  4. spool命令、创建一个表,创建而且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站...
  5. 山寨版学子商城——成功上线!
  6. VirtualBox安装增强功能时报错:未能加载虚拟光盘VBoxGuestAdditions.iso 到虚拟电脑
  7. vue axios ts 封装流文件下载方法
  8. 大众点评字体_大众点评字体解析
  9. Python读取excel文件数据并画柱状图
  10. 计算广告学--笔记(1)
  11. react hooks子组件向父组件传参
  12. 2014中秋节,用java为QQ游戏美女找茬写辅助
  13. 基于时空大数据的GIS技术,推动网格化管理创新发展
  14. nmap命令小结(一)
  15. blogger_如何在博客中添加推文并调试基本JavaScript:为什么Twitter.com/JavaScript/Blogger JSONP Widget停止工作?...
  16. 上大学究竟是来干什么的 为什么会这样
  17. iPhone 6 图像渲染揭秘
  18. 微信小程序分销系统有哪些营销模式?看完你就秒懂了!
  19. KMP算法-next函数介绍
  20. 车联网解决方案(PPT)

热门文章

  1. 农夫过河问题(一个有趣的问题-位运算)
  2. u盘/移动硬盘的视频文件出现损坏怎么办?修复损坏视频办法分享!
  3. 给出x.509证书的实例并分析其工作方式
  4. avcodec_receive_frame
  5. 【Git】git did not exit cleanly (exit code 1) 异常处理
  6. MySQL-HA高可用
  7. java 时间轮_基于时间轮的定时任务
  8. CEOI 2020, Day 2 A,B题解 CF1403A CF1403B
  9. 三维动画项目实训① ------(3.17-3.24)
  10. android u盘 uuid,Android4.4KitKat支持u盘功能