一、需求
今天对接某IDC运营商API的时候,发现一直没有对接成功。然后使用API文档中的PHP示例进行调试,请求响应是成功的。
通过wireshark进行抓包对比,发现请求参数是放在body中的,而不是使用QueryString的方式。如下图:
二、API文档中使用PHP Curl发送带Body GET请求的实现
function request($url, $data = array(), $method = 'GET') { $str = http_build_query($data); //请求头 //$header = array(); $ch = curl_init(); //初始化CURL句柄 curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); //设置请求方式 curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头信息 curl_setopt($ch, CURLOPT_POSTFIELDS, $str);//设置提交的字符串 $result = curl_exec($ch);//执行预定义的CURL return !(bool)curl_errno($ch) ? (array)json_decode($result, 1) : false; }
三、使用JAVA Apache HttpClient实现发送带Body的GET请求
3.1、自定义HttpGetWithEntity类
package com.renyiwei.beans; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { public final static String METHOE_NAME = "GET"; @Override public String getMethod() { return METHOE_NAME; } }
3.2、调用HttpGetWithEntity发送带Body的GET请求
private String doRequest(String url, Map<String,String> params, RequestMethod method)throws Exception{ CloseableHttpClient httpClient = HttpClients.createDefault(); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); for (String key : params.keySet()) { nameValuePairs.add(new BasicNameValuePair(key, params.get(key))); } UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8"); HttpGetWithEntity httpGet = new HttpGetWithEntity(); httpGet.setURI(new URI(url)); //自定义请求头 //httpGet.addHeader("X-HTTP-Method-Override",method.toString()); httpGet.setEntity(urlEncodedFormEntity); HttpResponse httpResponse = httpClient.execute(httpGet); String responseString = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); httpClient.close(); return responseString; }
四、参考文档
https://blog.csdn.net/liehuoruge91/article/details/78437076
https://stackoverflow.com/questions/12535016/apache-httpclient-get-with-body