resttemplate 發送帶header的get請求

兩種方法

使用注入的方式

    @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方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章