Параметры запроса в вызове PUT APIClient - PullRequest
0 голосов
/ 02 октября 2018

У меня есть конечная точка API, к которой я хочу сделать вызов PUT, для которого нужны как тело, так и параметры запроса.Я использую тестовый клиент Django для вызова моей конечной точки в тестовом примере ( docs ).

Я прочитал в документации, что для вызова 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 вручную?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Я просто указываю, что @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'))
0 голосов
/ 03 октября 2018

Предполагая, что вы используете rest_framework 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, я не уверен, насколько это достойно усилийхотя.

...