How to set respond header values in Spring Boot rest service method?

前端 未结 4 949
情书的邮戳
情书的邮戳 2020-12-28 18:44

Newbie question... I\'m building my first Spring Boot restful service. My restful service design requires some data to be returned in the response header.

How do I

相关标签:
4条回答
  • 2020-12-28 19:10

    To set Response Header there are multiple ways:

    1. As mentioned by @Matias Elorriaga, you can use this to add header to single response.
    2. Or, To add header to all responses you can also add java Filters.
    
    import java.io.IOException;
    
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Component;
    
    @javax.servlet.annotation.WebFilter(urlPatterns = {"/*"})
    @Component
    public class ResponseHeaderFilter implements javax.servlet.Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletResponse res = (HttpServletResponse) response;
            res.setHeader("My-Custom-Header", "Header-Value-Here");
            chain.doFilter(request, response);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        public void destroy() {
        }
    }
    
    
    1. Or, In Spring 5, you can also have WebFilter to add headers to all responses.
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import org.springframework.web.server.WebFilter;
    import org.springframework.web.server.WebFilterChain;
    
    @Component
    public class ResponseHeaderWebFilter implements WebFilter {
    
        @Override
        public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
            exchange.getResponse().getHeaders().add("My-Custom-Header", "My-Value-Here");
            return chain.filter(exchange);
        }
    }
    
    
    0 讨论(0)
  • 2020-12-28 19:17

    I was looking for an answer, and I don't like to have to create a response entity. I found the solution on the spring-forums, so credits to the writer.

    In short, you can request the response in the method-declaration, so this can be populated.

    A simple example:

    @RequestMapping(value="/car/{carId}", method = RequestMethod.Get)
    @ResponseBody
    public Car getCarById(@PathVariable("carId") String Id, HttpServletResponse response) {
    
        response.setHeader("X-Special-Header", myCar.getEcoLabel());
        //get the car
        return myCar;
    }
    

    Hope this helps others as well.

    http://forum.spring.io/forum/spring-projects/web-services/102652-setting-header-values-with-spring-rest-controller

    0 讨论(0)
  • 2020-12-28 19:21

    Unlike the other answer, don't use HttpServletResponse. You don't wanna be working with low-level Servlet APIs if you can avoid it. Return a ResponseEntity or HttpEntity.

    HttpHeaders headers = new HttpHeaders();
    headers.add("1", "uno");
    
    return new ResponseEntity<>(headers, HttpStatus.OK);
    
    0 讨论(0)
  • 2020-12-28 19:34

    From the Spring Documentation:

    @RequestMapping("/handle")
    public ResponseEntity<String> handle() {
        URI location = ...;
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setLocation(location);
        responseHeaders.set("MyResponseHeader", "MyValue");
        return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
    }
    

    Source: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html

    0 讨论(0)
提交回复
热议问题