发送自定义标头RestTemplate

时间:2018-10-24 02:23:51

标签: java spring spring-boot resttemplate

我正在尝试在RestTemplate请求中设置自定义标头。我正在使用Spring Boot 2.0.6.RELEASE

我尝试在公共方法中这样设置它们

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("muh Header", "muh value");

每次尝试执行此操作时,都会产生以下错误

'HttpHeaders(java.util.Map<java.lang.String,java.util.List<java.lang.String>>)' has private access in 'java.net.http.

我理解该错误消息,这意味着我试图在声明私有类的类之外实例化私有类。

那最好的行动方针是什么?

3 个答案:

答案 0 :(得分:1)

您可以创建一个拦截器来拦截其余模板发送的所有请求,并添加自定义标头,

void store(int pid){
    int arr[10];
    int i = 0;
    for(i = 0; i < 10; i++){
        if(arr[i] == 0){
            arr[i] = pid;
            printArray(arr);
            break;
        }
    }
}

int stuff(int a){
    int status = fork();

    if(status == 0){
        printf("PID IS %d\n", getpid());
        store(getpid());
    }
    else {
        printf("PID IS %d\n", getpid()); 
        store(getpid());
    }

    return a + 1;
}

int main(int argc, char * argv[]){
    int a = stuff(10);

    return 0;
}

如果要将相同的自定义标头添加到通过此其余模板发送的所有请求中,这将很好地工作。这种方法的优点之一是,您只能在一个地方设置自定义HTTP标头,而不是在提交请求的任何地方都可以这样做。

答案 1 :(得分:1)

我会选择这样的东西:

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class WebController {
    private static final String template = "Hello, %s!";

    @RequestMapping("/greeting")
    public ResponseEntity<String> greeting(@RequestParam(value="name", defaultValue="World") String name){
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("thisiskey", "this is value");
        return new ResponseEntity<>(name, headers, HttpStatus.ACCEPTED);
    }
}

enter image description here

要思考的要点:

  1. 您想多久添加一次自定义标头,并且它们每隔多久变化一次? 如果仅适用于一两个,则可以考虑使用此选项,但是如果该选项超过两次,则建议使用http拦截器。

  2. 实现MultiValueMap的
  3. header.add(“”,“”)->不接受header.add(“ mua key”,“ ...”)->因为键中有空格

答案 2 :(得分:1)

您使用的包是错误的,为了在使用Spring restTemplate时添加标题,您应该使用org.springframework.http.HttpHeaders.HttpHeaders而不是java.net.http.HttpHeaders,后者就是您要使用的。

这是添加请求标头的代码段。

// request resource
HttpHeaders headers = new HttpHeaders();
headers.set("headerName", "headerValue");

HttpEntity entity = new HttpEntity(headers);

ResponseEntity<String> response = restTemplate.exchange("some url", HttpMethod.GET, entity, String.class);