Inside your config block type this:
console.log($httpProvider.defaults.headers.post);
// Object {Content-Type: "application/json;charset=utf-8"}
As you can see, $http already has a default header for a post method.
When you declare common headers $http would not override the method specific headers with the common headers. The opposite is the true, first the common headers are applied then the method specific headers override them (if exist).
You can reset the defaults like so:
$httpProvider.defaults.headers.post = {};
Inside http.js you can see how headers are being merged:
function mergeHeaders(config) {
var defHeaders = defaults.headers,
reqHeaders = extend({}, config.headers),
defHeaderName, lowercaseDefHeaderName, reqHeaderName;
defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);
When using Angular.extend, the properties of later object overrides the properties of any preceding objects.