实战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();
        }


        //获取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);
    }

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

  • 43
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
好的,以下是一个使用Apache HttpClient发送POST请求获取Token的示例代码: ```java import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; public class TokenUtils { private static final String TOKEN_URL = "http://example.com/token"; private static final String CLIENT_ID = "your_client_id"; private static final String CLIENT_SECRET = "your_client_secret"; public static String getToken() throws IOException, URISyntaxException { HttpPost httpPost = new HttpPost(new URI(TOKEN_URL)); List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("grant_type", "client_credentials")); params.add(new BasicNameValuePair("client_id", CLIENT_ID)); params.add(new BasicNameValuePair("client_secret", CLIENT_SECRET)); httpPost.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8)); HttpResponse response = HttpClients.createDefault().execute(httpPost); HttpEntity entity = response.getEntity(); if (entity != null) { String responseString = EntityUtils.toString(entity, StandardCharsets.UTF_8); // 解析JSON获取Token return parseToken(responseString); } else { throw new IOException("Response entity is null"); } } private static String parseToken(String jsonString) { // 解析JSON字符串获取Token // ... } } ``` 在上面的代码中,我们首先定义了获取Token的URL地址、客户端ID和客户端密钥等参数。然后,我们创建了一个HttpPost对象,设置了请求参数,并使用HttpClients.createDefault()方法创建了一个HttpClient对象并执行POST请求。接着,我们获取响应实体,并使用EntityUtils.toString()方法将其转换为字符串类型。最后,我们调用parseToken()方法解析JSON字符串获取Token。 需要注意的是,这里的代码抛出了IOException和URISyntaxException异常,你需要在调用该方法时进行异常处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

  T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值