A REST API can return the resource representation in many formats – to be more specific MIME-types. A client application or browser can request for any supported MIME type in HTTP Accept header. Technically,
Accept header can have multiple values in form of comma separated values.
For example, an
Accept header requesting for
application/xml formats can be set as:
Accept : text/html,application/xml
The ‘q’ Parameter
Sometimes client may want to set their preferences when requesting multiple
MIME types. To set this preference,
q parameter (relative quality factor) is used.
q parameter can be from 0 to 1. 0 is lowest value (i.e. least preferred) and 1 is highest (i.e. most preferred).
A sample usage can be:
Accept : text/html, application/xml;q=0.9, */*;q=0.8
In above example, client is indicating the server that it will prefer to have the response in
text/html format, first. It server does not support
text/html format for requested resource than it shall send
application/xml format. If none of both formats are available, then send the response in whatever format it support (
- One of the benefit of ‘q’ parameter is to minimize the client-server interactions, which could have happened due to failed content negotiations.
- It also allows clients to receive content types of which they may not be aware, an asterisk “*” may be used in place of either the second half of MIME type value or both halves.
Here’s how the HTTP spec defines it:
If there are two MIME types for given same
q value, then more specific type, between both, wins.
For example if both
*/* had a preference of 0.9 then
application/xml will be served by the server.
Acceptheader field is present, then it is assumed that the client accepts all media types. If an
Acceptheader field is present, and if the server cannot send a response which is acceptable according to the combined
Acceptfield value, then the server SHOULD send a
406 (not acceptable)response.