JSON в СООБЩЕНИЕ Python3 (shipcloud API)

#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 отслеживания.