java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > HttpClient POST请求第三方接口

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

作者:郭优秀的笔记

这篇文章主要介绍了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";
    }

总结

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

您可能感兴趣的文章:
阅读全文