为何Postman请求报Unsupported media type 'application/json'错误?
解决Postman请求DRF API返回415 Unsupported Media Type错误
下面是针对该问题的具体排查和解决步骤:
1. 验证Postman的Content-Type请求头
- 直接查看Postman的Raw请求头,确认
Content-Type的值是纯application/json,无多余空格、拼写错误或额外后缀(比如application/json; charset=utf-8可能会被部分解析器识别异常,优先用纯格式测试)。 - 操作:Postman中切换到
Headers标签,手动删除原有Content-Type后重新添加,确保键值对准确。
2. 确认DRF解析器配置
即使你说已指定解析器,仍需检查配置是否生效:
- 视图级配置:确保视图明确包含
JSONParser:from rest_framework.parsers import JSONParser class ProvisionCustomerView(APIView): permission_classes = [IsAuthenticated] serializer_class = ProvisionCustomerSerializer parser_classes = [JSONParser] # 必须添加这一行 def post(self, request): customer_data = request.data # 后续业务逻辑 - 全局配置:如果用全局解析器,在
settings.py中确认:REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', # 其他需要的解析器(如FormParser等) ] }
3. 检查Postman请求体格式
- 确保请求体是合法JSON格式:在Postman的
Body标签选择Raw,格式下拉框选JSON,输入内容必须符合JSON语法(比如用英文引号、正确的逗号分隔),示例:{"name": "test_customer", "email": "test@example.com"} - 避免混用
form-data/x-www-form-urlencoded模式和JSON请求头,这会导致媒体类型不匹配。
4. 排查中间件干扰
部分自定义中间件可能修改请求头,导致DRF无法正确识别Content-Type:
- 临时注释掉项目中自定义的中间件,重新测试请求,若恢复正常则逐个排查中间件的逻辑。
5. 对比单元测试与Postman的请求差异
单元测试通常会严格按照DRF要求构造请求,可通过以下方式对比差异:
- 在
settings.py开启Django请求日志,查看实际收到的请求头和请求体:LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': {'console': {'class': 'logging.StreamHandler'}}, 'loggers': { 'django.request': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, } } } - 启动项目后,观察控制台输出的请求信息,对比单元测试和Postman请求的
Content-Type、请求体是否一致。
内容的提问来源于stack exchange,提问作者Saul Feliz
相关产品推荐
相关产品推荐

