HttpClient POST请求第三方接口问题(多参数传参)

 更新时间:2023年07月15日 16:05:40   作者:郭优秀的笔记  
这篇文章主要介绍了HttpClient POST请求第三方接口问题(多参数传参),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

HttpClient POST请求第三方接口

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

在开发中经常遇到和第三方公司接口对接,需要拿到对方提供的数据或者是给对方提供,下面给大家提供一个自己写的demo,本地测试有效,利用post请求传参访问 ,希望可以帮到你

package test;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSONObject;
public class InterfaceRequest {
    public static void main(String[] args) {
        String url = "https://www.jianliyisheng.com/api/site/getprovincedata";
        HttpClient client = HttpClients.createDefault();
        //默认post请求
        HttpPost post = new HttpPost(url);
        //拼接多参数
        JSONObject json = new JSONObject();
        json.put("uid", "79");
        json.put("key", "d86e33fb43036df9f9c29ff8085ac653");
        json.put("timestamp", "1562296283");
        json.put("typekey", "wshh");
        try {
            post.addHeader("Content-type", "application/json; charset=utf-8");
            post.setHeader("Accept", "application/json");
            post.setEntity(new StringEntity(json.toString(), Charset.forName("utf-8")));
            HttpResponse httpResponse = client.execute(post);
            HttpEntity entity = httpResponse.getEntity();
            System.err.println("状态:" + httpResponse.getStatusLine());
            System.err.println("参数:" + EntityUtils.toString(entity));
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用httpclient请求第三方接口并携带cookie和参数

在实际开发中,经常会碰到需要请求第三方接口的情况,这种接口往往都需要先获取其身份验证标识,以此验证是否有权限访问这个接口。

最近我遇到这种情况,需要先获取到cookie,然后携带cookie及参数一起请求第三方接口,网络上有许多方法,这里是根据我自己的实际需求编写的代码。

依赖

<dependency>
      <groupId>commons-httpclient</groupId>
      <artifactId>commons-httpclient</artifactId>
      <version>3.1</version>
</dependency>
<dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpmime</artifactId>
     <version>4.5.10</version>
</dependency>

获取cookie

这里我的情况是每一个小时cookie就会失效,所有后端需要写一个定时任务每50分钟获取一次cookie,

获取cooike的方法:

public static String userLogin(String loginUrl, String name, String password) {
            HttpClient httpClient = new HttpClient();           
            PostMethod postMethod = new PostMethod(loginUrl);            
            NameValuePair[] data = {new NameValuePair("username", name),
                    new NameValuePair("password", password)};
            postMethod.setRequestBody(data);
            try {               
                httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
                int statusCode = httpClient.executeMethod(postMethod);
                // 获取 Cookie
                Cookie[] cookies = httpClient.getState().getCookies();
                String cookie = null;
                for (Cookie c : cookies) {
                    //筛选想要的cookie
                }
                return cookie;
            } catch (Exception e) {
                e.printStackTrace();
            }          
            return null;
    }

get请求携带cookie及参数

get请求比较简单易懂,参数数据可以直接添加在请求地址中

    /**
     * get请求并携带cookie
     * @param url
     * @return
     */
    public static String doGet(String url) {
        try {
            //创建get请求
            HttpGet httpGet = new HttpGet(url);
            httpGet.addHeader(new BasicHeader("cookie", UserTask.cookie));
            httpGet.setHeader("Connection", "keep-alive");            
            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
            CloseableHttpClient httpClient = httpClientBuilder.build();
            HttpResponse httpResponse = httpClient.execute(httpGet);
            // 响应状态
            if (httpResponse.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = httpResponse.getEntity();
                return EntityUtils.toString(entity, "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return “Error”;
    }

post请求携带cookie及参数

post请求相对复杂一点,这里又分为两种,一种为JSON数据,一种为表单格式,获取cookie使用的就是类似表单格式的处理,这里讨论的是用的较多的JSON格式,就是第三方接口需要的参数格式为JSON。

     /**
     * post请求并携带cookie
     * @param url
     * @param json
     * @return
     */
    public static String doPostJson(String url, String json) {
        System.out.println(json);
        // 创建Httpclient对象 
        CloseableHttpClient httpClient = HttpClients.createDefault();        
        CloseableHttpResponse response = null;       
        try {
            // 创建Post请求 
            HttpPost httpPost = new HttpPost(url);
            httpPost.addHeader(new BasicHeader("cookie", UserTask.cookie));
            httpPost.setHeader("Connection", "keep-alive");                    
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);         
            response = httpClient.execute(httpPost);
            if (response.getStatusLine().getStatusCode() == 200) {
                return EntityUtils.toString(response.getEntity(), "utf-8");               
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {                
                e.printStackTrace();
            }
        }
        return "Error";
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java关于含有继承类的成员初始化过程讲解

    Java关于含有继承类的成员初始化过程讲解

    今天小编就为大家分享一篇Java关于含有继承类的成员初始化过程讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • IDEA创建Java Web项目的超详细图文教学

    IDEA创建Java Web项目的超详细图文教学

    IDEA是程序员们常用的java集成开发环境,也是被公认为最好用的java开发工具,下面这篇文章主要给大家介绍了关于IDEA创建Java Web项目的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • IDEA整合Dubbo+Zookeeper+SpringBoot实现

    IDEA整合Dubbo+Zookeeper+SpringBoot实现

    初学者,想自己动手做一个简单的demo,本文主要介绍了IDEA整合Dubbo+Zookeeper+SpringBoot实现,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • GC调优实战之高分配速率High Allocation Rate

    GC调优实战之高分配速率High Allocation Rate

    这篇文章主要为大家介绍了GC调优之高分配速率High Allocation Rate的实战示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-01-01
  • Java基础之集合框架详解

    Java基础之集合框架详解

    这篇文章主要介绍了Java基础之集合框架详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • idea创建springboot项目(版本只能选择17和21)的解决方法

    idea创建springboot项目(版本只能选择17和21)的解决方法

    idea2023创建spring boot项目时,java版本无法选择11,本文主要介绍了idea创建springboot项目(版本只能选择17和21),下面就来介绍一下解决方法,感兴趣的可以了解一下
    2024-01-01
  • Java解析xml的四种方法汇总

    Java解析xml的四种方法汇总

    XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。java中基本的解析方式有四种,DOM解析、sax解析、JDOM解析和DOM4J解析,下面我们就来详细探讨下这四种方式
    2016-05-05
  • Java中的跨域和@CrossOrigin注解的作用详解

    Java中的跨域和@CrossOrigin注解的作用详解

    这篇文章主要介绍了Java中的跨域和@CrossOrigin注解的作用详解,跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制,需要的朋友可以参考下
    2023-12-12
  • Flink实现特定统计的归约聚合reduce操作

    Flink实现特定统计的归约聚合reduce操作

    这篇文章主要介绍了Flink实现特定统计的归约聚合reduce操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Java Socket实现猜数字小游戏

    Java Socket实现猜数字小游戏

    这篇文章主要为大家详细介绍了Java Socket实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09

最新评论