#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)
Еще раз спасибо.