4

我有一个 API 端点,我想对其进行 PUT 调用,该调用需要正文和查询参数。我使用 Django 的测试客户端在测试用例(文档)中调用我的端点。

我在文档中读到,对于 GET 调用,使用参数引入查询参数data。我还读到对于 PUT 调用,参数data代表主体。我错过了如何在 PUT 调用中添加查询参数的文档。

特别是,这个测试用例失败了:

data = ['image_1', 'image_2']
url = reverse('images')
response = self.client.put(url, 
                           data=data, 
                           content_type='application/json', 
                           params={'width': 100, 'height': 200})

这个测试用例通过了:

data = ['image_1', 'image_2']
url = reverse('images') + '?width=100&height=200'
response = self.client.put(url, 
                           data=data, 
                           content_type='application/json')

换句话说:这种手动构建 URL 真的有必要吗?

4

2 回答 2

3

我只是详细说明@henriquesalvaro 的回答。

您可以传递查询参数PUTPOST方法,如下所示。

# tests.py
def test_xxxxx(self):
    url = 'xxxxx'
    res = self.client.put(url,**{'QUERY_STRING': 'a=10&b=20'})

# views.py
class TestViewSet(.....):

    def ...(self, request, *args, **kwargs):
        print(request.query_params.get('a'))
        print(request.query_params.get('b'))
于 2019-03-18T03:28:18.407 回答
3

假设您使用的是 rest_framework's APITestClient,我发现了这个:

def get(self, path, data=None, secure=False, **extra):
    """Construct a GET request."""
    data = {} if data is None else data
    r = {
        'QUERY_STRING': urlencode(data, doseq=True),
    }
    r.update(extra)
    return self.generic('GET', path, secure=secure, **r)

而看跌期权是:

def put(self, path, data='', content_type='application/octet-stream',
        secure=False, **extra):
    """Construct a PUT request."""
    return self.generic('PUT', path, data, content_type,
                        secure=secure, **extra)

和有趣的部分(摘自self.generic代码):

    # If QUERY_STRING is absent or empty, we want to extract it from the URL.
    if not r.get('QUERY_STRING'):
        # WSGI requires latin-1 encoded strings. See get_path_info().
        query_string = force_bytes(parsed[4]).decode('iso-8859-1')
        r['QUERY_STRING'] = query_string
    return self.request(**r)

因此,您可能可以尝试使用创建该 dictQUERY_STRING并将其传递给put's kwargs,但我不确定这在努力方面是多么值得。

于 2018-10-03T02:51:00.103 回答