spring boot RestTemplate 发送get请求的踩坑及解决

网友投稿 1117 2022-12-17

spring boot RestTemplate 发送get请求的踩坑及解决

spring boot RestTemplate 发送get请求的踩坑及解决

spring boot RestTemplate 发送get请求踩坑

闲话少说,代码说话

RestTemplate 实例

手动实例化,这个我基本不用

RestTemplate restTemplate = new RestTemplate();

依赖注入,通常情况下我使用 java- 包下的类构建的 SimpleClientHttpRequestFactory

@Configuration

public class RestConfiguration {

@Bean

@ConditionalOnMissingBean({RestOperations.class, RestTemplate.class})

public RestOperations restOperations() {

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();

requestFactory.setReadTimeout(5000);

requestFactory.setConnectTimeout(5000);

RestTemplate restTemplate = new RestTemplate(requestFactory);

// 使用 utf-8 编码集的 conver 替换默认的 conver(默认的 string conver 的编码集为 "ISO-8859-1")

List> messageConverters = restTemplate.getMessageConverters();

Iterator> iterator = messageConverters.iterator();

while (iterator.hasNext()) {

HttpMessageConverter> converter = ithttp://erator.next();

if (converter instanceof StringHttpMessageConverter) {

iterator.remove();

}

}

messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));

return restTemplate;

}

}

请求地址

get 请求 url 为

http://localhost:8080/test/sendSms?phone=手机号&msg=短信内容

错误使用

@Autowired

private RestOperations restOperations;

public void test() throws Exception{

String url = "http://localhost:8080/test/sendSms";

Map uriVariables = new HashMap();

uriVariables.put("phone", "151xxxxxxxx");

uriVariables.put("msg", "测试短信内容");

String result = restOperations.getForObject(url, String.class, uriVariables);

}

服务器接收的时候你会发现,接收的该请求时没有参数的

正确使用

@Autowired

private RestOperations restOperations;

public void test() throws Exception{

String url = "http://localhost:8080/test/sendSms?phone={phone}&msg={phone}";

Map uriVariables = new HashMap();

uriVariables.put("phone", "151xxxxxxxx");

uriVariables.put("msg", "测试短信内容");

String result = restOperations.getForObject(url, String.class, uriVariables);

}

等价于

@Autowired

private RestOperations restOperations;

public void test() throws Exception{

String url = "http://localhost:8080/test/sendSms?phone={phone}&msg={phone}";

String result = restOperations.getForObject(url, String.class, "151xxxxxxxx", "测试短信内容");

}

springboot restTemplate访问get,post请求的各种方式

springboot中封装好了访问外部请求的方法类,那就是RestTemplate。下面就简单介绍一下,RestTemplate访问外部请求的方法。

get请求

首先get请求的参数是拼接在url后面的。所以不需要额外添加参数。但是也需要分两种情况。

1、 有请求头

由于 getForEntity() 和 getForObject() 都无法加入请求头。所以需要请求头的连接只能使用 exchange() 来访问。代码如下

public jsONObject test(){

try {

RestTemplate re = new RestTemplate();

HttpHeaders headers = new HttpHeaders();

String url = "http://test.api.com?id=123";

headers.set("Content-Type","APPlication/json");

HttpEntity jsonObject= re.exchange(url, HttpMethod.GET,new HttpEntity<>(headers),JSONObject.class);

log.info("返回:{}",jsonObject.getBody());

return jsonObject.getBody();

}catch (Exception e){

log.error(e.getMessage());

}

return null;

}

2、 无请求头

无需请求头的可以用三个方法实现。getForEntity() 和 getForObject() 还有 exchange() 都可以实现。下面讲前两种用的比较多的。

getForEntity()

public JSONObject test(){

try {

RestTemplate re = new RestTemplate();

String url = "http://api.help.bj-/apis/alarm/?id=101020100";

HttpEntity jsonObject= re.getForEntity(url,JSONObject.class);

log.info("返回:{}",jsonObject.getBody());

return jsonObject.getBody();

}catch (Exception e){

log.error(e.getMessage());

}

return null;

}

getForObject()

public JSONObject test(){

try {

RestTemplate re = new Rehttp://stTemplate();

String url = "http://api.help.bj-/apis/alarm/?id=101020100";

JSONObject jsonObject= re.getForObject(url,JSONObject.class);

log.info("返回:{}",jsonObject);

return jsonObject;

}catch (Exception e){

log.error(e.getMessage());

}

return null;

}

post请求

post请求也分几种情况

1、参数在body的form-data里面

public static JSONObject test(){

try {

RestTemplate re = new RestTemplate();

String url = "http://localhost:8101/test";

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.MULTIPART_FORM_DATA);

MultiValueMap loginJson = new LinkedMultiValueMap<>();

loginJson.add("id", "123");

JSONObject jsonObject= re.postForObject(url,new HttpEntity<>(loginJson,headers),JSONObject.class);

log.info("返回:{}",jsonObject);

return jsonObject;

}catch (Exception e){

log.error(e.getMessage());

}

return null;

}

还可以把 postForObject 换成 postForEntity

2、参数在body的x-www-from-urlencodeed里面

只需要把请求头的setContentType改成下面即可

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

public static JSONObject test(){

try {

RestTemplate re = new RestTemplate();

String url = "http://localhost:8101/test";

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap loginJson = new LinkedMultiValueMap<>();

loginJson.add("id", "123");

JSONObject jsonObject= re.postForObject(url,new HttpEntity<>(loginJson,headers),JSONObject.class);

log.info("返回:{}",jsonObject);

return jsonObject;

}catch (Exception e){

log.error(e.getMessage());

}

return null;

}

3、参数在body的raw里面

public static JSONObject test(){

try {

RestTemplate re = new RestTemplate();

String url = "http://localhost:8101/test";

HttpHeaders headers = new HttpHeaders();

headers.set("Content-Type","application/json");

JSONObject jsonObject = new JSONObject();

jsonObject.put("id","1");

JSONObject jsonObject1 = restTemplate

.postForObject(url,new HttpEntity<>(jsonObject,headers),JSONObject.class);

log.info("返回:{}",jsonObject1);

return jsonObject;

}catch (Exception e){

log.error(e.getMessage());

}

return null;

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot中@Transiactional注解没有效果的解决
下一篇:SpringBoot 如何使用RestTemplate发送Post请求
相关文章

 发表评论

暂时没有评论,来抢沙发吧~