1. В том, что PHP автоматически разбирает в $_POST только запросы с Content-Type: application/x-www-form-urlencoded или Content-Type: multipart/form-data. Запросы с другими типами содержимого надо получать самостоятельно через
php://input. Пытаться изменить пришедшие данные установкой Content-Type бесполезно, тем более, что функция header добавляет заголовок ответа и не меняет ничего в запросе.
2. Какой нужен, такой и правильный.