When you make a POST request, you have to encode the data that forms the body of the request in some way.
HTML forms provide three methods of encoding.
Work was being done on adding application/json, but that has been abandoned.
The specifics of the formats don't matter to most developers. The important points are:
When you are writing client-side code, all you need to know is use multipart/form-data when your form includes any <input type="file"> elements.
When you are writing server-side code: Use a prewritten form handling library (e.g. Perl's CGI->param or the one exposed by PHP's $_POST superglobal) and it will take care of the differences for you. Don't bother trying to parse the raw input received by the server.
Never use text/plain.
If you are writing (or debugging) a library for parsing or generating the raw data, then you need to start worrying about the format. You might also want to know about it for interest's sake.
application/x-www-form-urlencoded is more or less the same as a query string on the end of the URL.
multipart/form-data is significantly more complicated but it allows entire files to be included in the data. An example of the result can be found in the HTML 4 specification.
text/plain is introduced by HTML 5 and is useful only for debugging — from the spec: They are not reliably interpretable by computer — and I'd argue that the others combined with tools (like the Net tab in the developer tools of most browsers) are better for that).