使用Django REST Framework时cURL无法显示JSON数据问题
解决Django REST Framework中cURL无法返回JSON数据的问题
我之前学DRF的时候也碰到过一模一样的情况!浏览器能正常拿到200响应和JSON数据,但cURL就是没反应或者返回非预期内容,多半是请求的细节没跟上,咱们逐个排查:
1. 给cURL加上Accept: application/json请求头
浏览器访问API时会自动发送符合要求的Accept头,但cURL默认的请求头可能不满足DRF的格式要求,导致它返回了HTML格式的错误页面(只是你没直观看到而已)。试试用这个命令:
curl -H "Accept: application/json" http://localhost:8000/你的代码片段URI/
2. 检查是否存在重定向问题
如果你的URI末尾没加/,Django默认会返回301重定向到带/的地址,但cURL默认不会自动跟随重定向。这时候你可以:
- 直接给URI加上末尾的
/,比如http://localhost:8000/snippets/ - 或者给cURL加上
-L参数让它自动跟随重定向:
curl -L http://localhost:8000/snippets
3. 用-v参数查看完整请求/响应细节
给cURL加上-v参数,能输出完整的请求头、响应状态码和返回内容,帮你精准定位问题:
curl -v http://localhost:8000/你的代码片段URI/
比如你可能会发现返回的是403状态码(CSRF验证失败),或者响应的Content-Type是text/html而非application/json,这样就能快速找到根因了。
4. 处理CSRF验证(如果适用)
如果你的视图启用了SessionAuthentication(比如需要登录才能访问),那cURL需要带上CSRF Token才能正常请求:
- 先获取CSRF Cookie:
curl -c cookies.txt http://localhost:8000/
- 从
cookies.txt里找到csrftoken的值,再带着Cookie和Token请求:
curl -b cookies.txt -H "X-CSRFToken: 你的CSRF_TOKEN值" http://localhost:8000/你的代码片段URI/
不过普通的只读API,DRF默认的APIView是关闭CSRF验证的,这个情况概率不高,但可以作为最后排查项。
先从加Accept头和-v参数开始试,基本就能解决问题啦!
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

