#json #python-3.x #api #python-requests
#json #python-3.x #API #python-запросы
Вопрос:
Я хочу создать отправку в Shipcloud через API-POST. Как описано в документах https://developers.shipcloud.io/reference/shipments_request_schema.html Я использую модуль запросов для Python3. И я пытаюсь преобразовать этот json в python, потому что я получаю «NameError: имя ‘true’ не определено». Я нашел аналогичный пример на github Github example vinothzeabalane, но этот предназначен для получения адресов. Почему это не работает?
import requests
import json
from shipcloud_apikey import bk_sandbox_apikey
datas = {
{
"to": {
"company": "Receiver Inc.",
"first_name": "John",
"last_name": "Doe",
"street": "Beispielstrasse",
"street_no": "42",
"city": "Musterhausen",
"zip_code": "22100",
"country": "DE"
},
"package": {
"weight": 15,
"length": 30,
"width": 30,
"height": 30,
"type": "parcel"
},
"carrier": "dpd",
"service": "standard",
"reference_number": "ref123456",
"notification_email": "john.doe@company.com",
"create_shipping_label": true
}
}
pydata = json.load(datas)
requests.post('https://api.shipcloud.io/v1/shipments', auth=('bk_sandbox_apikey', ''), data = pydata)
Ответ №1:
Ну, здесь есть несколько проблем:
1) У вас есть один дополнительный набор скобок {}
, окружающих словарь, которого там не должно быть (я предполагаю, что это происходит при копировании кода здесь). Таким образом, данные должны быть:
datas = {
"to": {
"company": "Receiver Inc.",
"first_name": "John",
"last_name": "Doe",
"street": "Beispielstrasse",
"street_no": "42",
"city": "Musterhausen",
"zip_code": "22100",
"country": "DE"
},
"package": {
"weight": 15,
"length": 30,
"width": 30,
"height": 30,
"type": "parcel"
},
"carrier": "dpd",
"service": "standard",
"reference_number": "ref123456",
"notification_email": "john.doe@company.com",
"create_shipping_label": true
}
2) json.загрузка принимает переменную типа filehandle для возврата словаря, по сути, это создало бы словарь, который вы уже создаете вручную.
3) Это правильно, true
ожидается, что в этом сценарии это переменная, и, поскольку она не определена, это вызывает ошибку. Таким образом, я не думаю, что вам действительно нужен json.load, но решение, я надеюсь, что это поможет, было бы сначала изменить true
фактическую переменную данных, так:
"create_shipping_label": True
А затем используйте json.dumps для преобразования словаря в строку и json.loads для преобразования строки обратно в словарь, например:
pydata = json.loads(json.dumps(datas))
Опять же, я не думаю, что вам это может понадобиться, но, по крайней мере, выполнение этого гарантирует, что данные правильно работают с библиотекой json.
Комментарии:
1. Вы правы. Мне не нужно преобразовывать его в действительный код python. Модуль запросов может обработать это, когда я записываю весь массив json в одной строке. Фигурные скобки, похоже, в порядке. Также я оставляю в облаке значение json-true таким, какое оно есть.
Ответ №2:
У меня это сработало:
import requests
r = requests.post('https://api.shipcloud.io/v1/shipments', auth=(bk_sandbox_apikey, ''), data='{"to": {"company": "nocompany","first_name": "lalaal","last_name": "asdasd","street": "Musterstrasse","street_no": "71","city": "Musterhausen","zip_code": "73324","country": "DE"},"package": {"weight": 7,"length": 10,"width": 10,"height": 10,"type": "parcel"},"carrier": "dpd","service": "standard","reference_number": "TESTSENDUNG BK2","notification_email": "test@testing.de","create_shipping_label": true}')
print(r)
print(r.text)
для print (r) я получаю обратно код состояния 200, что означает, что все сработало просто отлично.
r.text возвращает идентификатор shipcloud и URL отслеживания.