原文来自:https://admins.blog.csdn.net/article/details/109809386
前言
最近调用公司项目一个接口时,发现该接口是一个Get请求,入参在Body 中(json格式)。场景如下:A服务需发送http请求调用B服务的接口(该接口为Get方式,入参是一个json字符串在body中传递)
当我看到这个接口的时候,感觉好奇怪(MMP,干嘛不用POST请求。Get就get,请求还放Body中,心里有些不爽)尽管心里不爽,但是也只能默默接受,撸起袖子 “干” 就完了!
实现过程:
首先官方不推荐这样做,但是http(基于tcp的超文本传输协议)并没有规定,Get 请求不能加body
一.首先我写了一个Get请求接口,本地测试一下,便于大家直观的理解
本地使用postman调用是成功的,接下来我们使用Java代码请求调用
二.使用Http工具类调用Get请求(json参数)
1.引入httpclient 依赖
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
2.定义一个HttpGet实体类
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import java.net.URI;
/**
* @author xf
* @version 1.0.0
* @ClassName HttpGetWithEntity
* @Description TODO 定义一个带body的GET请求 继承 HttpEntityEnclosingRequestBase
* @createTime 2020.11.18 13:51
*/
public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {
private final static String METHOD_NAME = "GET";
@Override
public String getMethod() {
return METHOD_NAME;
}
public HttpGetWithEntity() {
super();
}
public HttpGetWithEntity(final URI uri) {
super();
setURI(uri);
}
HttpGetWithEntity(final String uri) {
super();
setURI(URI.create(uri));
}
}
3.HttpGet请求公共方法
/**
* 发送get请求,参数为json
* @param url
* @param param
* @param encoding
* @return
* @throws Exception
*/
public static String sendJsonByGetReq(String url, String param, String encoding) throws Exception {
String body = "";
//创建httpclient对象
CloseableHttpClient client = HttpClients.createDefault();
HttpGetWithEntity httpGetWithEntity = new HttpGetWithEntity(url);
HttpEntity httpEntity = new StringEntity(param, ContentType.APPLICATION_JSON);
httpGetWithEntity.setEntity(httpEntity);
//执行请求操作,并拿到结果(同步阻塞)
CloseableHttpResponse response = client.execute(httpGetWithEntity);
//获取结果实体
HttpEntity entity = response.getEntity();
if (entity != null) {
//按指定编码转换结果实体为String类型
body = EntityUtils.toString(entity, encoding);
}
//释放链接
response.close();
return body;
}
4.运行服务,本地测试调用一下该接口
/**
* 测试 Get 请求
*/
@Test
public void test(){
String url = "http://127.0.0.1:8012/export/getByBodyJson";
Map<String, Object> map = new HashMap<>();
map.put("stuName","张一山");
map.put("school","北京戏剧学院");
String reqParams = JSONArray.toJSON(map).toString();
try {
String s = sendJsonByGetReq(url, reqParams, "UTF-8");
System.out.println("请求Get请求返回结果:"+s);
} catch (Exception e) {
e.printStackTrace();
}
}
三.使用HttpGet请求发送body入参调用成功
package com.utils.httpclient; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class HttpClientUtil { //发送请求的url // public static String url = "http://192.168.9.247:3080/co/cmd/deleteProject"; /** * @Author: yc * @Description: HttpClient发送Post请求 携带json参数 * @Date: 2022/10/07/18:32 */ public static String jsonPost(String url, JSONObject json) throws IOException { String content=null; // 获取HttpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); // 声明Post请求 HttpPost httpPost = new HttpPost(url); // 设置请求头,在Post请求中限制了浏览器后才能访问 // httpPost.addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"); httpPost.addHeader("Accept", "*/*"); // httpPost.addHeader("Accept-Encoding", "gzip, deflate, br"); httpPost.addHeader("Content-Type", "application/json"); httpPost.addHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); httpPost.addHeader("Connection", "keep-alive"); // 省略前面声明请求、设置Header等操作,直接从传递参数开始 // JSONObject json = new JSONObject(); // json.put("filePath","js"); // json.put("projectId","61020ccdfd33d86b6abe8745"); // json.put("type","fileFolder"); // // 将参数放到Post中 // 通过new StringEntity(),可将Content-Type设置为text/plain类型 // httpPost.setEntity(new StringEntity(json.toString(),"UTF-8")); httpPost.setEntity(new StringEntity(json.toString(), "UTF-8")); // 发送请求 CloseableHttpResponse response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); // 获取返回的信息 content = EntityUtils.toString(entity, "UTF-8"); System.out.println("获取的值为:"+content); } else { System.out.println("访问失败!!!"); } // 关闭response、HttpClient资源 response.close(); httpClient.close(); return content; } /** * 发送get请求,参数为json * @param url * @param param * @param encoding * @return * @throws Exception */ public static String sendJsonByGetReq(String url, String param, String encoding) throws Exception { String body = ""; //创建httpclient对象 CloseableHttpClient client = HttpClients.createDefault(); HttpGetWithEntity httpGetWithEntity = new HttpGetWithEntity(url); HttpEntity httpEntity = new StringEntity(param, ContentType.APPLICATION_JSON); httpGetWithEntity.setEntity(httpEntity); //执行请求操作,并拿到结果(同步阻塞) CloseableHttpResponse response = client.execute(httpGetWithEntity); //获取结果实体 HttpEntity entity = response.getEntity(); if (entity != null) { //按指定编码转换结果实体为String类型 body = EntityUtils.toString(entity, encoding); } //释放链接 response.close(); return body; } public static void main(String[] args) throws IOException { String url="http://168.1.15.43:8003/localEndPoint?name=123"; // JSONObject jsonObject=new JSONObject(); // jsonObject.put("aa","123"); // String aa=HttpClientUtil.jsonPost(url,jsonObject); // System.out.println(aa); // // String url = "http://127.0.0.1:8012/export/getByBodyJson"; Map<String, Object> map = new HashMap<>(); map.put("stuName","张一山"); map.put("school","北京戏剧学院"); String reqParams = JSONArray.toJSON(map).toString(); try { String s = sendJsonByGetReq(url, reqParams, "UTF-8"); System.out.println("请求Get请求返回结果:"+s); } catch (Exception e) { e.printStackTrace(); } } }
标签:body,HttpGet,http,String,url,json,import,请求 From: https://www.cnblogs.com/rerise/p/16759684.html