Параметры запроса в вызове PUT APIClient
У меня есть конечная точка 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 вручную?
1 ответ
Я просто уточняю, что @henriquesalvaro ответит более подробно.
Вы можете передать параметры запроса в PUT
или же POST
метод как ниже.
# 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'))
Предполагая, что вы используете 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)
так что вы могли бы попытаться создать этот диктат с QUERY_STRING
и передать его put
Кваргс, я не уверен, насколько это достойно усилий.