您好,登录后才能下订单哦!
本篇内容介绍了“SpringBoot怎么使用RestTemplate来调用接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
使用RestTemplate来调用接口
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; /** * RestTemplate配置模板 * * @author like */@Configurationpublic class RestTemplateConfig {     @Bean    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {        return new RestTemplate(factory);    }     @Bean    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();        factory.setReadTimeout(5000);//单位为ms        factory.setConnectTimeout(5000);//单位为ms        return factory;    } }注意点:如果在编译器中提示factory不能自动注入,那应该时跟其他类有冲突,有多个 ClientHttpRequestFactory
把这个factory的名字改一下,改成其他的就好了,比如这里就直接改成 simpleClientHttpRequestFactory

2.1postForObject方法
postForObject指post请求,并返回一个Object对象。
new HttpEntity(请求体)
new HttpEntity(请求头)
new HttpEntity(请求体,请求头)

2.1.1使用Json来传递和接收数据
首先引入fastJson的pom配置
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency>
在实现类中注入RestTemplate

接下来new一个 ExpressionDomain 对象,将这个对象转化成JSONObject。使用Json来传递数据
public void postByDefault(){    ExpressionDomain expressionDomain=new ExpressionDomain("hello","hasaki","win");    JSONObject jsonObj = (JSONObject) JSONObject.toJSON(expressionDomain);        //设置请求头    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);    headers.add("Accept", MediaType.APPLICATION_JSON.toString());     //请求体    HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);        //发起请求    String jsonResult = restTemplate.postForObject("http://localhost:8081/findDataByReflection" , formEntity, String.class);        //将Json字符串解析成对象    Response resp = JSON.parseObject(jsonResult, new TypeReference<Response>() {});}接收端
用@RequestBody注解一个参数,用于自动解析Json为对象。返回的Response也是一个对象,添加@ResponseBody注解,将返回Json字符串。解析的时候将Json字符串解析成对象即可。

和getForEntity原理是一样的,下面会讲到。
2.2getForObject方法
getForObject指get请求,并返回一个Object对象。这里有3种方法。
2.2.1
通过Map传参数的方式 可以使用map来封装请求参数,并作为getForObject的第三个参数,同时修改url如下,map中的"1"会替换url中的{1},"2"会替换url中的{2}
Map map = new HashMap();map.put("1", "hello");map.put("2", "world");String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}¶m2={2}", String.class,map);接口端:
@RequestMapping(value = "/getIds", method = RequestMethod.GET)public @ResponseBody String getIds(String param1, String param2) {    return param1 + param2;}2.2.2 通过可变参数的方式
也可以直接将要传递的值放到getForObject方法的参数结尾,数量不限,它会按顺序替换{1}和{2}。接口端代码还是和2.2.1的一样
String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}¶m2={2}", String.class, "hello", "world");2.3getForEntity方法
getForEntity和getForObject的用法是一样的,只是其返回结果是一个ResponseEntity,其中包含了更多的响应信息,比如:
		ResponseEntity response = restTemplate.getForEntity("http://localhost:8081/getIds",String.class);		response.getHeaders();		//响应头		response.getStatusCode();	//响应码		response.getBody();			//响应体,即前面的result第1个参数:请求的url地址
第2个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
第3个参数:参数值,这里有Map和 可变参数两种形式
第3个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
第4个参数:参数值,这里有Map和 可变参数两种形式(通常用不到,数据通常放在Json里就全部传输过去了)
第1个参数:请求的url地址
第2个参数:其实是HttpEntity,这个类主要有三种构造方法,如下
1.新建一个配置类,配置RestTemplate的Bean
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; /** * RestTemplate配置模板 * * @author like */@Configurationpublic class RestTemplateConfig {     @Bean    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {        return new RestTemplate(factory);    }     @Bean    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();        factory.setReadTimeout(5000);//单位为ms        factory.setConnectTimeout(5000);//单位为ms        return factory;    } }注意点:如果在编译器中提示factory不能自动注入,那应该时跟其他类有冲突,有多个 ClientHttpRequestFactory
把这个factory的名字改一下,改成其他的就好了,比如这里就直接改成 simpleClientHttpRequestFactory

2.1postForObject方法
postForObject指post请求,并返回一个Object对象。
new HttpEntity(请求体)
new HttpEntity(请求头)
new HttpEntity(请求体,请求头)

2.1.1使用Json来传递和接收数据
首先引入fastJson的pom配置
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency>
在实现类中注入RestTemplate

接下来new一个 ExpressionDomain 对象,将这个对象转化成JSONObject。使用Json来传递数据
public void postByDefault(){    ExpressionDomain expressionDomain=new ExpressionDomain("hello","hasaki","win");    JSONObject jsonObj = (JSONObject) JSONObject.toJSON(expressionDomain);        //设置请求头    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);    headers.add("Accept", MediaType.APPLICATION_JSON.toString());     //请求体    HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);        //发起请求    String jsonResult = restTemplate.postForObject("http://localhost:8081/findDataByReflection" , formEntity, String.class);        //将Json字符串解析成对象    Response resp = JSON.parseObject(jsonResult, new TypeReference<Response>() {});}接收端
用@RequestBody注解一个参数,用于自动解析Json为对象。返回的Response也是一个对象,添加@ResponseBody注解,将返回Json字符串。解析的时候将Json字符串解析成对象即可。

和getForEntity原理是一样的,下面会讲到。
2.2getForObject方法
getForObject指get请求,并返回一个Object对象。这里有3种方法。
2.2.1
通过Map传参数的方式 可以使用map来封装请求参数,并作为getForObject的第三个参数,同时修改url如下,map中的"1"会替换url中的{1},"2"会替换url中的{2}
Map map = new HashMap();map.put("1", "hello");map.put("2", "world");String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}¶m2={2}", String.class,map);接口端:
@RequestMapping(value = "/getIds", method = RequestMethod.GET)public @ResponseBody String getIds(String param1, String param2) {    return param1 + param2;}2.2.2 通过可变参数的方式
也可以直接将要传递的值放到getForObject方法的参数结尾,数量不限,它会按顺序替换{1}和{2}。接口端代码还是和2.2.1的一样
String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}¶m2={2}", String.class, "hello", "world");2.3getForEntity方法
getForEntity和getForObject的用法是一样的,只是其返回结果是一个ResponseEntity,其中包含了更多的响应信息,比如:
		ResponseEntity response = restTemplate.getForEntity("http://localhost:8081/getIds",String.class);		response.getHeaders();		//响应头		response.getStatusCode();	//响应码		response.getBody();			//响应体,即前面的result    @PostMapping("/testm")    public ReturnResult show11(@RequestParam("id") String id,                               @RequestParam("name") String name) {        System.out.println(id);        UserInfo userInfo = userInfoMapper.selectByUserName(name);         return ReturnResult.create(userInfo);    }这是restTemplate调用
    //Post,@RequestParam---postForEntity    @Test    public void sho11() {        String url = "http://127.0.0.1:8099/user/testm";        MultiValueMap<String, String> request = new LinkedMultiValueMap<>();        request.add("id", "12324");        request.add("name", "nanc");         ResponseEntity<ReturnResult> resp = restTemplate.postForEntity(url, request, ReturnResult.class);        ReturnResult body = resp.getBody();        UserInfo data = body.getData();        System.err.println(data.getUserId());        System.out.println(data);      }第1个参数:请求的url地址
第2个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
第3个参数:参数值,这里有Map和 可变参数两种形式
第3个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
第4个参数:参数值,这里有Map和 可变参数两种形式(通常用不到,数据通常放在Json里就全部传输过去了)
第1个参数:请求的url地址
第2个参数:其实是HttpEntity,这个类主要有三种构造方法,如下
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; /** * RestTemplate配置模板 * * @author like */@Configurationpublic class RestTemplateConfig {     @Bean    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {        return new RestTemplate(factory);    }     @Bean    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();        factory.setReadTimeout(5000);//单位为ms        factory.setConnectTimeout(5000);//单位为ms        return factory;    } }注意点:如果在编译器中提示factory不能自动注入,那应该时跟其他类有冲突,有多个 ClientHttpRequestFactory
把这个factory的名字改一下,改成其他的就好了,比如这里就直接改成 simpleClientHttpRequestFactory

2.1postForObject方法
postForObject指post请求,并返回一个Object对象。
第1个参数:请求的url地址
第2个参数:其实是HttpEntity,这个类主要有三种构造方法,如下
new HttpEntity(请求体)
new HttpEntity(请求头)
new HttpEntity(请求体,请求头)
第3个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
第4个参数:参数值,这里有Map和 可变参数两种形式(通常用不到,数据通常放在Json里就全部传输过去了)

2.1.1使用Json来传递和接收数据
首先引入fastJson的pom配置
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency>
在实现类中注入RestTemplate

接下来new一个 ExpressionDomain 对象,将这个对象转化成JSONObject。使用Json来传递数据
public void postByDefault(){    ExpressionDomain expressionDomain=new ExpressionDomain("hello","hasaki","win");    JSONObject jsonObj = (JSONObject) JSONObject.toJSON(expressionDomain);        //设置请求头    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);    headers.add("Accept", MediaType.APPLICATION_JSON.toString());     //请求体    HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);        //发起请求    String jsonResult = restTemplate.postForObject("http://localhost:8081/findDataByReflection" , formEntity, String.class);        //将Json字符串解析成对象    Response resp = JSON.parseObject(jsonResult, new TypeReference<Response>() {});}接收端
用@RequestBody注解一个参数,用于自动解析Json为对象。返回的Response也是一个对象,添加@ResponseBody注解,将返回Json字符串。解析的时候将Json字符串解析成对象即可。

和getForEntity原理是一样的,下面会讲到。
2.2getForObject方法
getForObject指get请求,并返回一个Object对象。这里有3种方法。
第1个参数:请求的url地址
第2个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
第3个参数:参数值,这里有Map和 可变参数两种形式
2.2.1
通过Map传参数的方式 可以使用map来封装请求参数,并作为getForObject的第三个参数,同时修改url如下,map中的"1"会替换url中的{1},"2"会替换url中的{2}
Map map = new HashMap();map.put("1", "hello");map.put("2", "world");String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}¶m2={2}", String.class,map);接口端:
@RequestMapping(value = "/getIds", method = RequestMethod.GET)public @ResponseBody String getIds(String param1, String param2) {    return param1 + param2;}2.2.2 通过可变参数的方式
也可以直接将要传递的值放到getForObject方法的参数结尾,数量不限,它会按顺序替换{1}和{2}。接口端代码还是和2.2.1的一样
String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}¶m2={2}", String.class, "hello", "world");2.3getForEntity方法
getForEntity和getForObject的用法是一样的,只是其返回结果是一个ResponseEntity,其中包含了更多的响应信息,比如:
		ResponseEntity response = restTemplate.getForEntity("http://localhost:8081/getIds",String.class);		response.getHeaders();		//响应头		response.getStatusCode();	//响应码		response.getBody();			//响应体,即前面的result    @PostMapping("/testm")    public ReturnResult show11(@RequestParam("id") String id,                               @RequestParam("name") String name) {        System.out.println(id);        UserInfo userInfo = userInfoMapper.selectByUserName(name);         return ReturnResult.create(userInfo);    }这是restTemplate调用
    //Post,@RequestParam---postForEntity    @Test    public void sho11() {        String url = "http://127.0.0.1:8099/user/testm";        MultiValueMap<String, String> request = new LinkedMultiValueMap<>();        request.add("id", "12324");        request.add("name", "nanc");         ResponseEntity<ReturnResult> resp = restTemplate.postForEntity(url, request, ReturnResult.class);        ReturnResult body = resp.getBody();        UserInfo data = body.getData();        System.err.println(data.getUserId());        System.out.println(data);      }    @GetMapping("/testp")    public ReturnResult show22(@RequestParam String name,                               @RequestParam Integer age,                               @RequestParam String clazz) {        System.out.println(name + "-" + age + "-" + clazz);        UserInfo userInfo = userInfoMapper.selectByUserName(name);        return ReturnResult.create(userInfo);    }resttemplate
    //Get ,@RequestParam-----getForObject    @Test    public void sho12() {        String url = "http://127.0.0.1:8099/rest/testp?name={name}&age={age}&clazz={clazz}";        Map<String, Object> map = new HashMap<>();        map.put("name", "nanc");        map.put("age", 34);        map.put("clazz", "12");        ReturnResult forObject = restTemplate.getForObject(url, ReturnResult.class, map);        UserInfo data = forObject.getData();        System.out.println(data);    }“SpringBoot怎么使用RestTemplate来调用接口”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。