Django HttpRequest对象无法获取JSON参数问题排查
问题分析与解决方法
问题根源
使用requests.get()时,即便传入json参数,HTTP规范里GET请求不会携带请求体(request body),所以Django端的request.body为空,自然解析不到目标JSON数据。
解决方法
方法一:改用POST请求(推荐)
POST请求支持携带请求体,适合传递JSON数据:
客户端代码修改
import requests endpoint = 'http://127.0.0.1:8000/api' # 将get请求改为post请求 get_response = requests.post(endpoint, params={"abc":345}, json={"query":"hi, this is what you are looking for!"} ) print(get_response.json())
Django视图代码优化(可选,更简洁)
Django 3.1+内置了JSON请求体解析方法,无需手动调用json.loads:
from django.http import JsonResponse from django.http import HttpRequest def api_home(request: HttpRequest, *args, **kwargs): data = {} if request.content_type == 'application/json' and request.body: data = request.json() # 自动解析请求体中的JSON print(data) return JsonResponse({'message': 'hi there, this is your Django API response'})
方法二:必须用GET请求时,将JSON放入查询参数
如果业务要求必须使用GET请求,可以把JSON序列化为字符串后作为查询参数传递:
客户端代码
import requests import json endpoint = 'http://127.0.0.1:8000/api' # 把JSON序列化为字符串,作为查询参数的一部分 params = { "abc": 345, "query_json": json.dumps({"query":"hi, this is what you are looking for!"}) } get_response = requests.get(endpoint, params=params) print(get_response.json())
Django视图代码
from django.http import JsonResponse import json def api_home(request, *args, **kwargs): data = {} query_json = request.GET.get('query_json') if query_json: try: data = json.loads(query_json) except: pass print(data) return JsonResponse({'message': 'hi there, this is your Django API response'})
内容的提问来源于stack exchange,提问作者Yamin Hossain
相关产品推荐
相关产品推荐

