简体   繁体   中英

Some information about how Spring MVC recive and use the Accept Header in these two case

I am studying on the Spring MVC showcase example dowlodable from the STS dashboard.

In this time I am studying on the Converters section of this example and I have some question for you.

To start, in my view I have the following two links:

<li>
    <a id="writeJsonAccept" class="writeJsonLink" href="<c:url value="/messageconverters/json" />">Write JSON via Accept=application/json</a>
</li>

<li>
    <a id="writeJsonExt" class="writeJsonLink" href="<c:url value="messageconverters/json" />">Write JSON via ".json"</a>
</li>

The first link generate an HTTP Request towards the URL: messageconverters/json

The second link generate an HTTP Request towards the URL: /messageconverters/json.json (differently from the first URL this one end with .json extension

Ok, both these links have class="writeJsonLink" and related to the click event of these links the following JQuery callback function is called:

$("a.writeJsonLink").click(function() {

    var link = $(this);                      

    $.ajax({ 
        url: this.href,  

        beforeSend: function(req) { 

            if (!this.url.match(/\.json$/)) { 
                req.setRequestHeader("Accept", "application/json");          
            }
        },
        success: function(json) {
            MvcUtil.showSuccessResponse(JSON.stringify(json), link);
        },
        error: function(xhr) {  
            MvcUtil.showErrorResponse(xhr.responseText, link);
        }});
    return false;
});

This function only execute an AJAX call and wait for an HTTP Response passing its content to an handler that will show the output in the view...ok...

Before sending the request, the function check if the URL don't end with .json extension

If this request don't end with .json extension the following header is added to my HTTP Request:

Accept = application/json

From what I know the Accept Header say which specific mediatype is considerable acceptable for the HTTP Response, in this case say that the only acceptable media type is a JavaScript object having JSON format, ok...

This Request is handled from the following method of my controller class that return a valorized object that will be converted in JSON forma using Jaxb2RootElementHttpMessageConverter

@RequestMapping(value="/json", method=RequestMethod.GET)
public ResponseEntity<JavaBean> writeJson() {

    // Oggetto che rappresenta gli HTTP Header dell'HTTP Response
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.TEXT_PLAIN);
    return new ResponseEntity<JavaBean>(new JavaBean("bar", "apple"), headers , HttpStatus.OK);

// return new JavaBean("bar", "apple"); }

Now, my question is about the differences from the two links.

The first one don't end with .json extension, so the Accept header is added and it is setted on application/json sayng that the browsers expects to receive a JSON object

The second one end with .json extension, so the Jquery method don't set the Accept Header

But, this thing what mean? that when an URL end with .json the Accept header is automatically setted? Or more generally, when I have an URL that end with some kind extension (for example like .xml) the relative Accept header is automatically setted?

Or simply in this second case, don't set the Accept Header mean don't handle the media type that I can recive in the body of the HTTP Response?

Ok, your english is not-so-hot, so let me try to help you the best I can.

In my understanding, which may very well be wrong, is that you want to know if the browser will set the Accept: header to be json when the URL ends in json? I do not believe this is the case. I may be greatly mistaken on this, but you can test this by using something like Firebug or Chrome's Developer Tools, or if you like IE get Fiddler, and see exactly what headers get sent from the browser.

Now, if you are asking if Spring will magically put the headers there, then again I think the answer is "no". The HTTP headers on the request come from the browser, and although you could put in a Servlet Filter or something to set the request filters, I think this would be dangerous to assume all browsers handle these request headers the same way.

No, if the question is "how are my requests all getting to my Controller's writeJson() method?", then the answer has nothing to do with the "Accept" header at all. Your method is matching on any URI pattern that ends in /json, and in both cases your URL ends in /json. If you want to filter on things that have an "Accept" header of JSON, then I think you want to do something like this:

@RequestMapping(value="/someUriPattern", headers = {"Accept=application/json"})

Please understand I typed the above from memory, so you may need to tweak it a tad.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM