RestTemplate发送带Body的http的get请求

原文取自:spring resttemplate get请求支持body_resttemplate get body_wangooo的博客-CSDN博客

resttemplate时不允许发送带有body的get请求的,因为 get 请求是HttpGet,HttpGet 继承 HttpRequestBase,HttpRequestBase 是不支持传递body的。

HttpEntityEnclosingRequestBase是可以传递body的,那就自定义一个工厂继承HttpComponentsClientHttpRequestFactory,重写createHttpUriRequest方法,当发送的请求是GET请求时,创建自定义的继承HttpEntityEnclosingRequestBase的类,这样GET请求就可以传送body。
代码:创建一个config包创建其中之一的config配置:HttpComponentsClientRestFulHttpRequestFactory

package com.example.clienthttpbin.demos.config;

import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Component;

import java.net.URI;

/**
 * @author ShiGuoLi
 */
@Component
public class HttpComponentsClientRestFulHttpRequestFactory extends HttpComponentsClientHttpRequestFactory {
    @Override
    protected HttpUriRequest createHttpUriRequest( HttpMethod httpMethod, URI uri ) {

        if ( httpMethod == HttpMethod.GET ) {
            return new HttpGetRequestWithEntity( uri );
        }
        return super.createHttpUriRequest( httpMethod, uri );
    }

    private static final class HttpGetRequestWithEntity extends HttpEntityEnclosingRequestBase {
        public HttpGetRequestWithEntity( final URI uri ) {
            super.setURI( uri );
        }

        @Override
        public String getMethod( ) {
            return HttpMethod.GET.name();

        }


    }
}

然后再创建第二个config

package com.example.clienthttpbin.demos.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

/**
 * @author ShiGuoLi
 */
@Configuration
public class RestTemplateConfig {
    @Bean (name="remoteRestTemplate")
    public RestTemplate restTemplate( ClientHttpRequestFactory simpleClientHttpRequestFactory){
        RestTemplate restTemplate = new RestTemplate(simpleClientHttpRequestFactory);
        restTemplate.setRequestFactory(new HttpComponentsClientRestFulHttpRequestFactory());
        return restTemplate;
    }
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(60000);
        factory.setReadTimeout(20000);
        return factory;
    }

}

当调用的方法带有@RequestBody时,header中要设置成json格式

headers.setContentType( MediaType.APPLICATION_JSON );
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值