Spring RestTemplate返回Body为空

Spring RestTemplate返回的getBody为null问题

Spring RestTemplate请求返回的body内容为null

1.最近在项目中遇到一个问题就是,我准备用Spring中自带的工具进行请求的对方接口的时候。在测试环境没有任何问题,但是在调用对方的登陆接口的时候,对方接口返回了json数据,但是我通过一下方法拿到数据始终为null

 
 ResponseEntity<String> forEntity = restTemplate.postForEntity(url,formEntity, String.class);
 System.out.println(forEntity.getBody());
 //返回为null

起初我以为对方接口的问题.通过PostMan进行访问对方接口的时候,却能够正确返回json数据.然后通过打印底层的HttpClient的日志的时候发现,确实里面返回了数据。那到底是怎么回事呢?于是就猜测是不是RestTemplate的问题。经过不断的断点跟踪,发现了RestTemplate在处理返回的json数据的时候,是根据header中的一个Content-length判断是否有数据,恰好对方接口的返回了数据,但是这个参数为0.具体的源代码在:
RestTemplate中的

@Nullable
	protected <T> T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback,
			@Nullable ResponseExtractor<T> responseExtractor) throws RestClientException {

		Assert.notNull(url, "'url' must not be null");
		Assert.notNull(method, "'method' must not be null");
		ClientHttpResponse response = null;
		try {
			ClientHttpRequest request = createRequest(url, method);
			if (requestCallback != null) {
				requestCallback.doWithRequest(request);
			}
			response = request.execute();
			//跟踪返回的结果,这里是在处理返回的结果
			handleResponse(url, method, response);
			if (responseExtractor != null) {
				return responseExtractor.extractData(response);
			}
			else {
				return null;
			}
		}
		catch (IOException ex) {
			String resource = url.toString();
			String query = url.getRawQuery();
			resource = (query != null ? resource.substring(0, resource.indexOf('?')) : resource);
			throw new ResourceAccessException("I/O error on " + method.name() +
					" request for \"" + resource + "\": " + ex.getMessage(), ex);
		}
		finally {
			if (response != null) {
				response.close();
			}
		}
	}

里面的这个方法是在处理结果:

@Override
		public ResponseEntity<T> extractData(ClientHttpResponse response) throws IOException {
			if (this.delegate != null) {
				T body = this.delegate.extractData(response);
				return ResponseEntity.status(response.getRawStatusCode()).headers(response.getHeaders()).body(body);
			}
			else {
				return ResponseEntity.status(response.getRawStatusCode()).headers(response.getHeaders()).build();
			}
		}
	}

MessageBodyClientHttpResponseWrapper中获取了Content-length的长度判断是否有数据。

	public boolean hasMessageBody() throws IOException {
		HttpStatus status = HttpStatus.resolve(getRawStatusCode());
		if (status != null && (status.is1xxInformational() || status == HttpStatus.NO_CONTENT ||
				status == HttpStatus.NOT_MODIFIED)) {
			return false;
		}
		//这里判断为0就直接返回false。实际上是有数据的
		if (getHeaders().getContentLength() == 0) {
			return false;
		}
		return true;
	}

在这里插入图片描述

PostMan请求结果也看到Content-length为0
在这里插入图片描述
后面我换成HttpClient方式就能解决了这个问题,具体原因还没有去深入研究。但是这个参数看网上都说Conent-length代表了body的大小。有知道的大神告诉一下。

在你提供的代码示例中,出现了一个问题,即Spring RestTemplate返回getBody为null。这个问题可能是由于你没有正确设置请求头和请求体导致的。在你的代码中,你设置了请求头和请求体: ```java HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); HttpEntity<String> entity = new HttpEntity<>(json, headers); ``` 但是你没有给出完整的代码,所以无法确定具体出现问题的位置。但是根据你提供的信息,我可以提出一些建议来解决这个问题。 首先,确保你的请求体json字符串正确地转换为了C类的对象。你可以使用一些工具类或库来进行json字符串和对象之间的转换。例如,你可以使用Jackson库或者Google Gson库。确保你已经正确地将json字符串转换为了C类的对象。 其次,检查你的请求头是否正确设置。你使用的是`MediaType.APPLICATION_JSON_UTF8`作为请求头的媒体类型。确保这个媒体类型与你的接口的要求相匹配。如果你的接口要求使用其他媒体类型,例如`application/json`,请相应地更改请求头的设置。 最后,确认你的RestTemplate配置正确。确保你的RestTemplate对象已经正确地实例化,并且没有其他配置问题。 综上所述,要解决RestTemplate返回getBody为null问题,你需要确保请求体的转换正确,并且请求头设置正确。如果问题仍然存在,你可能需要进一步检查RestTemplate的配置和调用方式,以确定问题的根源。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring RestTemplate返回Body](https://blog.csdn.net/qianyiyiding/article/details/86558140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [RestTemplate通过对象传参,response的body讨论](https://blog.csdn.net/u013109501/article/details/109377424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值