So the Accept header tells the server the MIME-type of the resource the browser is looking for. For example, the server can send plain text, HTML, JSON, etc.

OK, that makes sense, but when I look at the Content-Type header and it seems to be doing the same thing. For example, it tells the server that it wants text or JSON.

So what is the difference between Accept and Content-Type HTTP headers?

up vote 133 down vote accepted

As you correctly note, the Accept header is used by HTTP clients to tell the server what content types they'll accept. The server will then send back a response, which will include a Content-Type header telling the client what the content type of the returned content actually is.

However, as you may have noticed, HTTP requests can also contain Content-Type headers. Why? Well, think about POST or PUT requests. With those request types, the client is actually sending a bunch of data to the server as part of the request, and the Content-Type header tells the server what the data actually is (and thus determines how the server will parse it).

In particular, for a POST request resulting from an HTML form submission, the Content-Type of the request will (normally) be one of the standard form content types below, as specified by the enctype attribute on the <form> tag:

  • application/x-www-form-urlencoded (default, older, simpler, slightly less overhead for small amounts of simple ASCII text, no file upload support)
  • multipart/form-data (newer, adds support for file uploads, more efficient for large amounts of binary data or non-ASCII text)
  • Accept: is what the browser is able to digest, for example, all the languages someone can understand.
  • Content-Type: is what format the actual data is in, for example what language someone is speaking. Since computers can't (well, now they can) recognize other types like people can say "oh, he's German!" or "she's speaking Chinese!"
  • Not necessarily a browser, but any http client. – Jim Aho Nov 30 at 15:04

Accept is like

Here is my request and I would like (to Accept) this response format

Content-Type is like

Here is my request (or response) and this (Content-Type) is the format of the content I am sending in my request (or response)

  • I know I'm late here but I'm curious, what would happen if the response format isn't sent in the "Accept"ed format by server? – shriek Apr 25 at 18:17
  • That would be up to the client to decide @shriek. I guess most http clients (or browsers) will "intelligently" look at the real data and see what it truly is. Maybe one client could also disgard the response if it's supposed to be JSON, but parsing fails because it appears to be something else. – Jim Aho Nov 30 at 15:07

It is a request-response conversation, so the client

  • sends a request of "Content-Type" and
  • expects to receive the response of "Accept" media type.
  • Incorrect. Accept is a request header. See the accepted answer. – darron Sep 17 '17 at 23:00
  • 1
    @darron No, this answer is correct. He's not saying it isn't a request header, he's saying its purpose is to tell the server what kind of response it expects to get back. Kind of redundant with the other answers, but I think it's the most concise. +1. – Todd Menier Sep 29 '17 at 21:07

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.