实战HttpClient 接口调用以及获取token 设置请求头

2023-10-26

简介:

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);
    }

测试结果
在这里插入图片描述
这篇博客只代表本人的理解与写法,只作为参考,不代表大众 勿喷谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战HttpClient 接口调用以及获取token 设置请求头 的相关文章

  • HttpWebRequest 与 HttpClient

    我有一段代码可以使用HttpWeb请求 and HttpWeb响应但我想将其转换为使用Http客户端 and Http响应消息 这是有效的代码块 HttpWebRequest request HttpWebRequest HttpWebRe
  • Java 中的 Apache HttpClient,instream.toString = org.apache.http.conn.EofSensorInputStream

    我正在使用 Apache HttpClient 获取页面 我想将服务器回复的 http 正文存储到一个字符串中 以便我可以操作该字符串并将其打印到控制台 不幸的是 当运行此方法时 我收到此消息 17 52 01 862 INFO Drive
  • HTTPclient POST 有问题的网站

    我正在尝试从 a 中检索一些数据web site http www atm mi it en Pages default aspx 我编写了一个 java 类 它似乎在许多站点上都工作得很好 但它不适用于这个特定的站点 该站点在输入 fom
  • 无法建立 SSL 连接

    我正在使用第三方库 Splunk C SDK http dev splunk com csharp 在我的 ASP NET Core 应用程序中 我尝试通过此 SDK 连接到我的本地主机 Splunk 服务 但出现异常 System Net
  • 服务器端对云服务执行多个请求

    我正在编写一个使用多个 Web API 的 Web 应用程序 对于单个用户的单个请求 我的应用程序可能需要对其他站点执行最多 30 个 HTTP 请求 包含网络应用程序的网站可以拥有数百个并发用户 我一直在四处寻找 试图找出应该使用哪个库
  • 奇怪的 HttpClient 结果

    当尝试从 Hitbox API 获取数据时 我得到了一个奇怪的结果 对于一个 API 的命令 这种情况每次都会发生 而对于另一个 API 的命令 这种情况只是有时发生 结果或多或少是这样的 这是我得到的最后结果 u001f b 0 0 0
  • 添加多个自定义http请求标头之谜

    HttpGet request new HttpGet https 192 168 1 140 8732 我想知道为什么我只能成功发送自定义标头 UserName 和 AuthToken 如果我执行以下操作 request setHeade
  • Angular 5 HttpClient 与之前的 Http 相比有哪些优势?

    我阅读了官方升级指南 上面写着 因为 HttpClient 得到广泛采用 我们决定 但是这个 HttpClient 带来的真正好处是什么 我正在考虑尝试一下 但中途感到困惑 因为我不知道升级后这些需要发生什么 从 angular http
  • 使用 HttpClient 和 C# 在 post 请求上发送 json

    我对这段代码有疑问 我的目标是通过 API 发送修改 所以我正在做request over HttpClient using System using System Collections Generic using System Net
  • Java NoSuchAlgorithmException - SunJSSE、sun.security.ssl.SSLContextImpl$DefaultSSLContext

    背景 我一直在它自己的 Eclipse 项目中使用 Authorize net SDK 一切都运转良好 然后我需要将其添加到我的主项目中 我将依赖项添加到类路径中 并将其复制到我需要的代码块中 它应该有效 Problem 长话短说 代码在我
  • C# 和 WPF - 使用 SecureString 作为客户端 HTTP API 密码

    在编写 WPF 应用程序时 PasswordBox将输入的密码存储为SecureString 这完全有道理 但是 我想通过 HTTP API 发送密码 并且HttpClientPostAsync 似乎接受表单编码数据的字符串 我知道其他人也
  • 你能推荐一些Python HTTP客户端库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想使用Python从一些网站捕获信息 我希望HTTP客户端满足这个条件 支持HTTPS 不会使用太多
  • 如何使用 HTTPClient 设置 HTTP 请求标头“身份验证”?

    我想在向服务器发送 POST 请求时设置 HTTP 请求标头 授权 我该如何在 Java 中做到这一点 HttpClient 有支持吗 http www w3 org Protocols HTTP HTRQ Headers html z9
  • 如何从 HttpClient 解析 JSON 字符串?

    我通过调用外部 API 获取 JSON 结果 HttpClient client new HttpClient client BaseAddress new Uri url client DefaultRequestHeaders Acce
  • Android Http 获取会话 Cookie

    我本来不想在这里发帖 因为网上有太多信息 但我已经深入搜寻但无法弄清楚 好吧 所以我无法让它在两种情况下工作 希望这两种情况的答案是相同的 我的问题是我设置了请求标头 但它似乎没有发送它 我有一个会话 id s e32ff223fwefd3
  • 初始化后将 HttpMessageHandler 设置为 HttpClient 的实例

    我想分享一个实例HttpClient在不同的请求之间 幸运的是这个类可以安全地同时使用 但我需要设置HttpMessageHandler对于每个单独的请求 因为它们可能有不同的 ClientCertificates 显然这只能通过构造函数来
  • Angular 7 将文件内容发布为 multipart/form-data

    我在字符串变量中提供了要发布的内容 我想使用 import HttpClient from angular common http 为了达到与以下相同的效果 curl F email protected cdn cgi l email pr
  • 当底层连接是有状态时如何使用 Apache HttpClient?

    我在谷歌上搜索了很多关于如何使用 HttpClient 进行多线程处理的信息 他们中的大多数人建议使用 ThreadSafeClientConnManager 但我的应用程序必须登录某个主机 登录表单页面 以便 HttpClient 获得底
  • bytes[] 未使用 HttpClient C# 在 Web api 接收

    我使用 HttpClient 和以下代码将 bytes 发送到 net core Web api 方法 从 Windows 应用程序到 Web API HttpClientHandler clientHandler new HttpClie
  • NameResolutionFailure 与 ConnectFailure 问题

    这是一个相当奇怪的问题 但仍然是一个非常糟糕的问题 当用户在没有互联网的情况下进入我们的应用程序时 我们会返回一个NameResolutionFailure作为尝试通过以下方式进行 API 调用的错误消息HttpClient 好吧 没关系

随机推荐

  • 神经网络(三)—— 神经元多输出

    本系列为慕课网 深度学习之神经网络 CNN RNN GAN 算法原理 实战 视频笔记 希望自己能通过分享笔记的形式更好的掌握该部分内容 往期回顾 神经网络 一 机器学习 深度学习简介 神经网络 二 神经元 Logistic回归模型 多分类的
  • 优化算法 - RMSProp算法

    文章目录 RMSProp算法 1 算法 2 从零开始实现 3 简洁实现 4 小结 RMSProp算法 1 算法 import math import torch from d2l import torch as d2l d2l set fi
  • APP版本升级与服务器交互

    踏入程序媛旅程已经快一年了 学生生涯也即将结束 正式踏入工作岗位 万事开头难 只能多问多记 久病成医 遇到的问题多了自己的技术也会有所提高 博客也一年了 之前一直想写博 然后各种拖延 到现在才开始 希望自己能坚持 项目中加了一个APP版本升
  • 一种基于深度学习的全自动纸心电图数字化算法

    深度学习在医学检测仪方面的应用 人们越来越关注将深度学习方法应用于心电图 ECG 最近的研究表明 神经网络 NN 可以仅通过 ECG 预测未来的心力衰竭或心房颤动 然而 神经网络的训练需要大量的心电图 而目前很多心电图只是纸质的 不适合神经
  • win10安装pycocotools遇到的问题(gcc.exe failed with exit status 1)

    背景安装pycocotools一直过不去 一直报错 PS C Users peter gt pip install git https github com philferriere cocoapi git subdirectory Pyt
  • Java —— 有关存储学生信息数组的操作

    class Test public class Test public static void main String args TODO Auto generated method stub Student s s new Student
  • 启动elasticsearch报错处理方式

    启动elasticsearch报错 bootstrap check failure 1 of 1 memory locking requested for elasticsearch process but memory is not lo
  • Flask web页面加载很慢的原因

    直接上正题吧 Flask写了个简单的页面 居然加载超过30s 排查问题发现如下 能想象加载3分钟后还是失败的心情嘛 解决方法如下 添加CDN 就是让游览器加载moment js时 不需要中介直接找到moment js文件 做法 在momen
  • Vue动态改变title的标题及图标

    1 首先安装 vue wechat title包 npm install vue wechat title save 2 引入包 设置每个页面的标题 在mian js中引入 作为全局使用 import VueWechatTitle from
  • 串口命令出现>号(大于号),无法继续执行命令,如何退出

    如果在输入无法结束 提示 gt 符号 大于号 时 可以尝试按下该组合来结束输入 ctrl c 向当前进程发送 SIGINT 信号 用于终止一个进程 ctrl z 向当前进程发送 SIGSTOP 信号 用于挂起一个进程 ctrl d 不是发送
  • React 组件的分类和Render返回值

    组件化原因 随着web的发展 许多与客户端交互的逻辑放在的客户端 用户交互 数据渲染 数据交换等 前端代码数据增多 页面逻辑复杂 难以维护 以上导致前端代码耦合度高 复用性低 开发效率底下 以上问题可以使用组件化发发解决 优点 对代码进行封
  • Java内部类

    内部类 说简单点就是一个类里面还可以定义一个类 内部类可以定义在别一个类的任意位置上 包括成员位置和局部位置 私有属性 private在本类中有效 1 内部类可以直接访问外部类中的成员 私有和非私有的都可以 2 外部类如果想要访问内部类 必
  • Linux文件创建及查看方法

    1 文件创建 vi vim 原来有文件就打开 没有就创建再打开 回车后进入命令模式 w w保存 q退出 强制 这三个可以自由组合 记住前面有冒号哦 n光标移至第n行 dd 删一行 xx 删一个 光标移至行末 G光标移至文末 查找某个字符串
  • RabbitMQ 启动报错 Failed to check/redeclare auto-delete queue(s) access to vhost '/' refused for user

    RabbitMQ 启动报错 Failed to check redeclare auto delete queue s access to vhost refused for user rabbit 今天项目在新的服务器上启动 所有的配置文
  • element-ui table 表格组件实现可拖拽效果(行、列)

    前言 最近需要实现table表格 行拖拽的功能 参照了一些优秀文章 实现了一下 参考文章 Vue进阶 幺零五 elementUI 实现表格行列拖拽 实现思路 主要是借助sortablejs 关于sortablejs我简单写了篇文章 有兴趣的
  • IDEA 最牛配置,写代码太爽了

    IDEA 最牛配置 写代码太爽了
  • qt:同一份代码在vs2022 QT VS TOOL扩展和 QtCreator下运行结果不同

    公司要求用的是QtCreator 但是谁能离得开安装了Resharper的VS呢 我就在VS下装了QT的环境 开始编写调试代码 其实是两个软件都在用的 可能是没找到方法 VS下的资源文件显示不是很方便 我就用QtCreator加资源 到后面
  • 远程RDP、远控手机、双屏控双屏,向日葵“瓜子会员”妥妥的真香

    最近儿有点 小感冒 没去公司在家歇着 居家归居家 砖还是要搬的 突然来活了也得及时的处理掉 这种时候我一般用远程桌面的方式 之前就一直用的向日葵远程控制 为啥用远程桌面呢 主要原因是家里电脑性能不如公司的工作站 而且缺少很多工作必须的专业软
  • godaddy服务器内网站转移,2021年Godaddy最新域名转出教程

    因为之前Goddady登录界面修改的原因 导致部分新手不知道Godaddy域名转出步骤 笔者特此做了一个简单的教程 供大家学习和参考 第一步 打开Godaddy官网 登录Godaddy账户 然后点击页面右侧的My Account 进入账号管
  • 实战HttpClient 接口调用以及获取token 设置请求头

    简介 HTTP 协议可能是现在 Internet 上使用得最多 最重要的协议了 越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源 虽然在 JDK 的 java net 包中已经提供了访问 HTTP 协议的基本功能 但