SpringBoot 如何使用RestTemplate來調用接口

使用RestTemplate來調用接口

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
 */
@Configuration
public 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.多種傳輸和接收參數的方式

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字符串解析成對象即可。

postForEntity

和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}&param2={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}&param2={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

RestTemplate調用接口總結

1.這是接口信息

    @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);  
    }

2.接口

    @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);
    }
 

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: