Python — Post запрос — ошибка 400 неверная отправка запроса json

#python #json #python-3.x #post

#python #json #python-3.x #Публикация

Вопрос:

Я получаю ошибку 400, когда пытаюсь отправить данные json в качестве post-запроса в свой локальный API. Если я печатаю содержимое (список), я вижу правильные данные, но когда я делаю post, я получаю ошибку 400. Есть идеи о том, что не так?

PS: мне нужно отправить данные в формате json, иначе произойдет сбой. Правильно ли я это делаю?

Ниже приведен код, который я использую:

 import requests
import json
from requests_ntlm import HttpNtlmAuth

headers = {
    "Content-type": "application/json",
}

list = []

with open('sample.txt') as f:
    lines = [line.rstrip() for line in f]

for x in lines:
    data = {
        "ApplicationName" : "App1",
        "ServerList" : x, 
        "StartDate" : "2020-12-12 12:00:00",
        "EndDate" : "2020-12-12 13:00:00",
        "SourceTool" : "Moon"
        }
    list.append(data)

list1 = json.dumps(list)
print(list1)

x = requests.post("http://my-local-endpoint.com",headers=headers, json=list1, auth=HttpNtlmAuth('my_username','mypassword'))

print(x.status_code)
 

Это результат, который я получаю:

 [{"ApplicationName": "App1", "ServerList": "Server1", "StartDate": "2020-12-12 12:00:00", "EndDate": "2020-12-12 13:00:00", "SourceTool": "Moon"}]
Status code:  400 Bad Request
 

Если я отправлю те же данные в Postman, все будет работать так, как ожидалось:

 {    
"ApplicationName":"App1",
"ServerList":"Server1",
"StartDate":"2020-12-12 12:00:00",
"EndDate":"2020-12-12 13:00:00",
"SourceTool":"Moon"
}
 

Комментарии:

1. Нет необходимости делать: list1 = json.dumps(list) Список будет преобразован в json при выполнении json=list в методе post. Я бы рекомендовал переименовать list на что-то другое, потому list что это ключевое слово.

2. Я изменил список для ListX, но проблема остается прежней.

3. похоже, что API не ожидает список. Попробуйте это list1 = json.dumps(список [0])

4. @rrudnicki Да, это верно. То, что вы отправляете из Python, — это список. В Postman это словарь.

Ответ №1:

Большое спасибо за вашу помощь, ребята. Я всегда путаюсь в кортежах, словаре и списках на python.

Даже при внесении изменений, о которых вы упомянули, я получил ошибку. Хитрость заключалась в том, чтобы изменить json=list1 на data=list1 по запросу.

Вот рабочий фрагмент кода.

 list1 = json.dumps(listx[0], indent=1)

x = requests.post("http://my-local-endpoint.com",headers=headers, data=list1, auth=HttpNtlmAuth('my_username','mypassword'))
print("Status code: ", response.status_code, response.reason, list1)
 

Еще раз спасибо.