API не принимает мои данные JSON от Python - PullRequest
0 голосов
/ 29 мая 2018

Я новичок в Python и имею дело с JSON.Я пытаюсь получить массив строк из моей базы данных и передать их API.Я не знаю, почему я получаю ошибку отсутствующих данных.Ребята, можете посмотреть?

###########################################

rpt_cursor = rpt_conn.cursor()
sql="""SELECT `ContactID` AS 'ContactId' FROM 
`BWG_reports`.`bounce_log_dummy`;"""
rpt_cursor.execute(sql)

row_headers=[x[0] for x in rpt_cursor.description] #this will extract row headers
row_values= rpt_cursor.fetchall()
json_data=[]
for result in row_values:
    json_data.append(dict(zip(row_headers,result)))
results_to_load = json.dumps(json_data)
print(results_to_load) # Prints: [{"ContactId": 9}, {"ContactId": 274556}]


headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
}

targetlist = '302'
# This is for their PUT to "add multiple contacts to lists".
api_request_url = 'https://api2.xyz.com/api/list/' + str(targetlist) 
+'/contactid/Api_Key/' + bwg_apikey

print(api_request_url) #Prints https://api2.xyz.com/api/list/302/contactid/Api_Key/#####
response = requests.put(api_request_url, headers=headers, data=results_to_load)

print(response) #Prints <Response [200]>
print(response.content) #Prints b'{"status":"error","Message":"ContactId is Required."}'

rpt_conn.commit()
rpt_cursor.close()

###########################################################

Редактировать для Clarity:

Я передаю это [{"ContactId": 9}, {"ContactId": 274556}] и я получаю это тело ответа b '{"status": "error", "Message": "ContactId обязательно."}'

APIдокумент дает это как от, чтобы следовать за телом запроса. [{"ContactId": "string"}]

Когда я вручную помещаю эти данные в тестовый объект, я получаю то, что хочу.[{"ContactId": "9"}, {"ContactId": "274556"}]

Может быть, что-то не так с json.dumps vs json.load?Разве я не создаю диктат, а скорее строку, которая выглядит как диктат?

РЕДАКТИРОВАТЬ, ЧТО Я В ЭТОМ ВЫРАЖАЛ!

Мне нужно было определить results_to_load = [] как дикт, прежде чем я загрузил его в results_to_load = json.dumps (json_data) .

Спасибоза все ответы и попытки помочь.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я выяснил это!:

Это было глупо.

Мне нужно было определить results_to_load = [] как пустой диктофон, прежде чем я загрузил его в results_to_load = json.dumps (json_data) .

Спасибо за все ответы и попытки помочь.

0 голосов
/ 29 мая 2018

Я бы порекомендовал вам пойти и проверить документацию по API, чтобы быть конкретными, но, похоже, API требует поле с именем ContactID, которое является массивом, а также массив объектов, где каждый объект имеет ключкак contactId

или

//correct
{
    contactId: [9,229]
} 

вместо

// not correct
[{contactId:9}, {contactId:229}]

Настройка может помочь:

res = {}
contacts = []
for result in row_values:
    contacts.append(result)
res[contactId] = contacts
...
...

response = requests.put(api_request_url, headers=headers, data=res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...