兩種方法
使用注入的方式
@Autowired
RestTemplate restTemplate;
@Test
public void getTest(){
//設置get請求參數
Map<String,String> params = new HashMap<>();
params.put("orgCode","900000");
params.put("waybillNo","773011197999686");
//設置請求頭參數
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("appId", "app_service");
HttpEntity request = new HttpEntity(requestHeaders);
ResponseEntity<String> exchange = restTemplate.exchange(INTERCEPT_URL + "?orgCode={orgCode}&waybillNo={waybillNo}", HttpMethod.GET,request, String.class, params);
System.out.println(exchange.getBody());
/**
* 也可以使用拼接參數的方式
*/
String orgCode = "900000";
String waybillNo = "773011197999686";
ResponseEntity<String> anotherExchange = restTemplate.exchange(INTERCEPT_URL + "?orgCode="+orgCode+"&waybillNo="+waybillNo, HttpMethod.GET,request, String.class);
System.out.println(anotherExchange.getBody());
}
使用new RestTemplate()的方式
依賴信息
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.1.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
spring-web 版本選擇
較低版本中的org.springframework.web.client.RestTemplate類中:
① httpEntityCallback(@Nullable Object requestBody, Type responseType)
② responseEntityExtractor(Type responseType)
是用protected修飾的,不方便調用
spring-core 版本選擇
spring-web是有spring-core依賴的,但是項目裏其他依賴也可能加載spring-core,建議直接指定一個spring-core版本。如果spring-core版本較低,低版本中不存在org.springframework.core.log.LogDelegateFactory類,在new RestTemplate()時會報錯:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/core/log/LogDelegateFactory
at org.springframework.http.HttpLogging.forLog(HttpLogging.java:68)
at org.springframework.http.HttpLogging.forLogName(HttpLogging.java:57)
at org.springframework.http.client.support.HttpAccessor.<init>(HttpAccessor.java:54)
at org.springframework.http.client.support.InterceptingHttpAccessor.<init>(InterceptingHttpAccessor.java:44)
at org.springframework.web.client.RestTemplate.<init>(RestTemplate.java:140)
at com.cainiao.spt.plugin.InterceptOnlineCheck.main(InterceptOnlineCheck.java:132)
Caused by: java.lang.ClassNotFoundException: org.springframework.core.log.LogDelegateFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more
請求代碼
public static void main(String[] args) throws Exception {
//設置請求頭
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("appId", "app_service");
HttpEntity request = new HttpEntity(requestHeaders);
RestTemplate restTemplate = new RestTemplate();
RequestCallback requestCallback = restTemplate.httpEntityCallback(request, String.class);
ResponseExtractor<ResponseEntity<String>> responseExtractor = restTemplate.responseEntityExtractor(String.class);
ResponseEntity<String> execute = restTemplate.execute(INTERCEPT_URL + "?orgCode=321300&waybillNo=773011197999686", HttpMethod.GET, requestCallback, responseExtractor, String.class);
System.out.println(execute.getBody());
分析
1.查看RestTemplate.java,發現getForObject和getForEntity都不支持傳入請求頭參數。
2.getForObject和getForEntity方法最終都是調用execute方法
3.那麼我們可以封裝好參數,直接調用execute方法