GET请求没有随APIClient Django DRF发送Body。

5
我希望您能够在Django DRF测试用例中使用GET请求发送数据正文。例如: APITestCase
data ={'hi':'bye'}
self.client.get('media_list/', {'body': data})

我可以使用以下代码在视图中获取body内容:

request.data.get('hi', None)

但是使用我的测试方法 {'body': data} 无法正常工作,但在 Postman 的原始类型中可以正常工作。

我尝试的方法(不起作用):

self.client.get('media_list/', data=data)

2
GET请求不包含任何正文。如果您想发送数据,请将其添加到查询参数中,或将请求更改为POST。 - Jason
@json 好的,现在我们可以在 GET 请求中发送请求体对吧? - karnataka
请参考 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/GET,以及“请求具有正文”一节。 - Jason
2个回答

12

在编写单元测试时,我遇到了这个问题。您可以使用以下解决方法来解决它。

问题: 当您使用client.get方法请求时,该方法会将数据放入url中。您可以在下面的链接中查看。
https://github.com/encode/django-rest-framework/blob/master/rest_framework/test.py#L194

解决方案: 您应该直接使用client.generic()。不要使用client.get()https://github.com/encode/django-rest-framework/blob/master/rest_framework/test.py#L203

示例

import json
from rest_framework.test import APIClient
from rest_framework.test import APITestCase


class TestClass(APITestCase):
    def setUp(self):
        # Setup run before every test method.
        pass

    def test_send_json_in_body(self):
        data ={'hi' : 'bye'}
        resp = self.client.generic(method="GET", path="/return/data/", data=json.dumps(data), content_type='application/json')

request._request
<WSGIRequest: GET '/return/data/'>
request.data
{'hi': 'bye'}

它有效了 :)


2
这应该是被接受的答案。谢谢! - JessieinAg
1
非常好用。帮了我很多忙。 - attalos
谢谢!正是我想要的。 - Joe

0

data` 返回请求体,对于获取 API,您需要获取查询参数 尝试下面的代码:


data = {'hi':'bye'}
self.client.get('media_list/', data)


request.query_params.get('hi', None)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接