关于restTemplate的get和post请求,header设置及传参方式

本文详细介绍了如何在Spring项目中使用RestTemplate进行GET和POST请求,包括无参、带参、不同传参方式(URL参数、请求体JSON)以及设置Header。涵盖实例演示和自定义RequestFactory的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.restTemplate的引入

当前项目里对外暴露的接口基本都是一个rest的api,与其他项目对接时,通常也是调用对方暴露出来的rest api【http的接口】。这就涉及到要在自己项目里发送http请求。
调用http请求的方式:可以自己使用httpclient或者其他原生方式构建http请求。spring当然也提供了调用模板,那就是restTemplate。本文就是罗列restTemplate的调用及不同的传参方式。

spring中引入(引入就由spring托管了。直接@Autowired注解引用就行)
spring-config.xml配置文件中添加
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"></bean>

springboot中引入
在启动类 XXXApp.java 中添加:
@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}
使用时,@Autowired注解引入

get请求

@Autowired
private RestTemplate restTemplate

String url="https://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=3ff9482454cb60bcb73f65c8c48d4209](https://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=3ff9482454cb60bcb73f65c8c48d4209)";
//无参 不用指定header的请求
JSONObect jsonobject=restTemplate.getForObject(url,JSONObject.class);

//无参指定header的请求
        HttpHeaders headers = new HttpHeaders();
        headers.set("Accept", "application/json");
        HttpEntity<JSONObject> httpEntity = new HttpEntity<>( headers);
JSONObject jsonobject=restTemplate.getForObject(url,JSONObject.class,httpEntity);

//指定header 
HttpHeaders headers = new HttpHeaders();
headers.set("mdmAppId", mdmAppId);
headers.set("mdmToken", mdmToken);
log.info("tyccompstafflistUrl request headers {}",headers);
HttpEntity<JSONObject> httpEntity = new HttpEntity<>( headers);
ResponseEntity<JSONObject> exchange = restTemplate.exchange(tyccompbase, HttpMethod.GET, httpEntity, JSONObject.class);
JSONObject jsonObject = exchange.getBody();

//有参,param方式的参数【参数是拼接在url路径上】
Map<String, Object> params = new HashMap<>();
params.put("param1", "value1");
params.put("param2", "value2");
JSONObject jsonobject=restTemplate.getForObject(url,JSONObject.class,params);

//有参,请求体body中json【较少见,调用方式如下:】
因为restTemplate默认使用的jdk的requestfactory,这种方式不支持get请求这样的传参,故需要将restTemplate的requestfactory设置为自定义的requestfactory继承HttpEntityEnclosingRequestBase具体如下:
private static final class HttpComponentsClientHttpRequestWithBodyFactory 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();
        }
    }
此种方式下的调用
        String temp="";//参数的json串
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Accept", "application/json");
        HttpEntity<JSONObject> httpEntity = new HttpEntity(temp, headers);
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestWithBodyFactory());//或者在注入之前set该requestfactory
        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
        String body = exchange.getBody();

post请求

//有参  请求体【body体中】json参数
JSONObject params=new JSONObject();
params.put("param1","value1");
JSONObject jsonobject=restTemplate.postForTemplate(url,params,JSONObject.class);

//有参 请求体中json参数 设置header头
        JSONObject param = new JSONObject();
        param.put("param1","value1");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Accept", "application/json");
        HttpEntity httpEntity = new HttpEntity<>(param, headers);
//JSONObject jsonObject = restTemplate.postForObject(url, httpEntity, JSONObject.class);
        String jsonObject = restTemplate.postForObject(IDMServiceBaseUrl+"/sendSecurityCode", httpEntity, String.class);
        JSONObject bodyMap = JSONObject.parseObject(jsonObject);

以上是resttemplate根据不同传参方式发送http请求的使用实例~~~~

`restTemplate.exchange`是Spring框架中的一个HTTP客户端工具,用于发送HTTP请求接收HTTP响应。 如果您要使用`restTemplate.exchange`方法发送带有JSON请求正文的POST请求并且接收JSON响应,可以像下面这样编写代码: ```java RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); String requestBody = "{\"key\":\"value\"}"; // JSON请求正文 HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers); URI uri = new URI("http://example.com/api/endpoint"); // 请求的URI ResponseEntity<String> responseEntity = restTemplate.exchange( uri, HttpMethod.POST, requestEntity, String.class); String responseBody = responseEntity.getBody(); // 响应正文 ``` 在上面的代码中,我们首先创建了一个`RestTemplate`实例,然后创建了一个`HttpHeaders`对象并将其设置为JSON格式。接着,我们构建了一个包含JSON请求正文的`HttpEntity`对象,并将其传递给`restTemplate.exchange`方法。此外,我们还指定了请求的HTTP方法类型请求的URI。 最后,我们从`ResponseEntity`对象中获取了响应的JSON正文。 请注意,上述代码中的JSON请求正文响应正文都是以字符串的形式进行处理的。如果您想使用Java对象来表示JSON请求响应,您需要使用一个JSON解析库,例如Jackson或Gson。您可以在`RestTemplate`中配置一个`HttpMessageConverter`来处理JSON格式的请求响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值