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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值