Python-запросы POST не содержат всех отправленных данных - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь создать новый заказ на PayU через API REST.Я посылаю «получить токен доступа», и у меня правильный ответ.Затем я отправляю «создать новый заказ», аааа, и у меня ошибка 103, синтаксис ошибки.

Я пытался набрать https://webhook.site/ и понял, почему синтаксис плох - у меня нет значений в списке.

Код отправки POST при создании нового заказа:

data = {
    "notifyUrl": "https://your.eshop.com/notify",
    "customerIp": "127.0.0.1",
    "merchantPosId": "00000",
    "description": "RTV market",
    "currencyCode": "PLN",
    "totalAmount": "15000",
    "products": [{
                "name": "Wireless mouse",
                "unitPrice": "15000",
                "quantity": "1"}]}

headers = {
"Content-Type": "application/json",
"Authorization": str('Bearer ' + access_token).encode()}

r = requests.post('https://webhook.site/9046f3b6-87c4-4be3-8544-8a3454412a55',
                   data=payload,
                   headers=headers)
return JsonResponse(r.json())

Webhooc покажет, что я отправил:

customerIp=127.0.0.1&notifyUrl=https%3A%2F%2Fyour.eshop.com%2Fnotify&currencyCode=PLN&products=name&products=unitPrice&products=quantity&description=RTV+market&merchantPosId=00000&totalAmount=15000

Нет значений 'name',«цена за единицу» и «количество».PayU подтвердил, что это единственная проблема.

Почему?Что не так?

Отправка простого запроса POST для получения токена всегда успешна.

1 Ответ

0 голосов
/ 23 октября 2018

Если вы хотите отправить JSON, используйте json аргумент post():

r = requests.post('https://webhook.site/9046f3b6-87c4-4be3-8544-8a3454412a55',
                   json=payload,  # Use the json argument
                   headers=headers)

В противном случае данные будут отправлены в виде данных в кодированной форме, что, я полагаю, не то, что выхотите, учитывая, что вы ожидаете отправить вложенный список products.

Когда вы используете аргумент json, тип контента автоматически устанавливается на application/json, поэтому вам не нужно его устанавливатьсебя.

headers = {
    # Content-Type not required
    "Authorization": str('Bearer ' + access_token).encode()
}

Дополнительная информация об использовании запросов на отправку JSON здесь

...