天下之事,必先处之难,而后易之。

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 更轻量。

posted @   boonya  阅读(75)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2022-10-11 Android中软键盘常见的问题
我有佳人隔窗而居,今有伊人明月之畔。
轻歌柔情冰壶之浣,涓涓清流梦入云端。
美人如娇温雅悠婉,目遇赏阅适而自欣。
百草层叠疏而有致,此情此思怀彼佳人。
念所思之唯心叩之,踽踽彳亍寤寐思之。
行云如风逝而复归,佳人一去莫知可回?
深闺冷瘦独自徘徊,处处明灯影还如只。
推窗见月疑是归人,阑珊灯火托手思忖。
庐居闲客而好品茗,斟茶徐徐漫漫生烟。

我有佳人在水之畔,瓮载渔舟浣纱归还。
明月相照月色还低,浅近芦苇深深如钿。
庐山秋月如美人衣,画堂春阁香气靡靡。
秋意幽笃残粉摇曳,轻轻如诉画中蝴蝶。
泾水潺潺取尔浇园,暮色黄昏如沐佳人。
青丝撩弄长裙翩翩,彩蝶飞舞执子手腕。
香带丝缕缓缓在肩,柔美体肤寸寸爱怜。
如水之殇美玉成欢,我有佳人清新如兰。
伊人在水我在一边,远远相望不可亵玩。

点击右上角即可分享
微信分享提示