RestTemplate.postForObject - Error: 400 Bad Request
我们需要知道,RestTmplate是基于HTTP Rest风格的请求方式,它也支持配置SSL的HTTPS访问。
我们可以对基于HTTP协议进行Header,Body等进行自定义封装,但请求Request都存在一个限制值大小范围。
1.代码对比
/**
*
* 发送post请求
*
* @param url
* 请求URL地址
* @param data
* json数据
* @param token
* RSA加密token【RSA({PlatformCode+TenantCode+DateTime.Now()})//平台代码
* +会员/租户代码+当前时间,然后进行RSA加密】
*/
public static String post(String url, String data, String token)
throws Exception {
HttpHeaders headers = new HttpHeaders();
/*headers.add(HttpHeadersImpl.ACCEPT, "application/json");
headers.add(HttpHeadersImpl.ACCEPT_ENCODING, "gzip");
headers.add(HttpHeadersImpl.CONTENT_ENCODING, "UTF-8");
headers.add(HttpHeadersImpl.CONTENT_TYPE,
"application/json; charset=UTF-8");
headers.add(HttpHeadersImpl.COOKIE, token);
headers.add("Token", token);*/
headers.add("Accept", "application/json");
headers.add("Accpet-Encoding", "gzip");
headers.add("Content-Encoding", "UTF-8");
headers.add("Content-Type", "application/json; charset=UTF-8");
headers.add("Token", token);
HttpEntity<String> formEntity = new HttpEntity<String>(data, headers);
return RestTemplateUtils.getInstance().postForObject(url, formEntity, String.class);
}
将需要的属性定义到Header:
/**
*
* 发送post请求
*
* @param url
* 请求URL地址
* @param data
* json数据
* @param token
* RSA加密token【RSA({PlatformCode+TenantCode+DateTime.Now()})//平台代码
* +会员/租户代码+当前时间,然后进行RSA加密】
*/
public static String postJZTD(String url, String data, String token)
throws Exception {
String platformCode = EhcacheUtil.get("JZTD_OMS_PLATFORMCODE").toString();
String memberCode = EhcacheUtil.get("JZTD_OMS_MEMBERCODE").toString();
String warehouseCode = EhcacheUtil.get("JZTD_OMS_WAREHOUSECODE").toString();
HttpHeaders headers = new HttpHeaders();
/*headers.add(HttpHeadersImpl.ACCEPT, "application/json");
headers.add(HttpHeadersImpl.ACCEPT_ENCODING, "gzip");
headers.add(HttpHeadersImpl.CONTENT_ENCODING, "UTF-8");
headers.add(HttpHeadersImpl.CONTENT_TYPE,
"application/json; charset=UTF-8");
headers.add(HttpHeadersImpl.COOKIE, token);
headers.add("Token", token);*/
headers.add("Accept", "application/json");
headers.add("Accpet-Encoding", "gzip");
headers.add("Content-Encoding", "UTF-8");
headers.add("Content-Type", "application/json; charset=UTF-8");
headers.add("Token", token);
headers.add("PlatformCode", platformCode);
headers.add("MemberCode", memberCode);
headers.add("WarehouseCode", warehouseCode);
HttpEntity<String> formEntity = new HttpEntity<String>(data, headers);
return RestTemplateUtils.getInstance().postForObject(url, formEntity, String.class);
}
按照经验,第一种不出意外是可以正确访问的,第二种就值得商榷了,因为加入了非HTTP定义属性字段。
2.解决方案
1.去掉非HTTP Header Request属性。
2.缩短HTTP Header Request属性的值。
3.了解更多关于HTTP的设置相关,以及Spring RestTemplate的HTTP Header限制。
一个简洁的Header设置:
public void foo(String state) {
MultiValueMap<String, Object> headers = new LinkedMultiValueMap<String, Object>();
headers.add("Accept", "application/json");
headers.add("Content-Type", "application/json");
String requestBody = "{\"statename\":\"" + state + "\"}";
HttpEntity request = new HttpEntity(requestBody, headers);
String apiResponse = getRestTemplate().postForObject(apiEndpoint,request, String.class);
System.out.println(apiResponse);
}
注:验证交互的数据最好定义在body里面,尽量让你的HTTP Header 更轻量。
纸上得来终觉浅,绝知此事要躬行。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2022-10-11 Android中软键盘常见的问题