Запросы Python: Multipart с одной частью как json - PullRequest
1 голос
/ 22 мая 2019

Genie API Netflix принимает JSON или multipart с одной деталью request в application/json и любым количеством attachment деталей в application/octet-stream.

Запросы делают простой JSON POST довольно простым:

requests.post(
  url=self.host + self.endpoint,
  json={
    "version" : "1.0",
    "user" : "genie",
    "name" : "List * ... Directories bash job",
    "description" : "Genie 3 Test Job",
    "configs" : [ "/home/travis/build/Netflix/genie/genie-web/build/resources/test/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests/job/config1" ],
    "dependencies" : [ "/home/travis/build/Netflix/genie/genie-web/build/resources/test/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests/job/dep1" ],
    "setupFile" : "/home/travis/build/Netflix/genie/genie-web/build/resources/test/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests/job/jobsetupfile",
    "commandArgs" : "-c 'echo hello world'",
    "clusterCriterias" : [ {
      "tags" : [ "localhost" ]
    } ],
    "commandCriteria" : [ "bash" ],
  },
)

Команда ограничена, поэтому, если у вас есть большая команда (запрос) для отправки, вам лучше использовать вложение.

С запросами не так сложно запросить составную часть:

requests.post(
  url=self.host + self.endpoint,
  json={
    "version" : "1.0",
    "user" : "genie",
    "name" : "List * ... Directories bash job",
    "description" : "Genie 3 Test Job",
    "configs" : [ "/home/travis/build/Netflix/genie/genie-web/build/resources/test/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests/job/config1" ],
    "dependencies" : [ "/home/travis/build/Netflix/genie/genie-web/build/resources/test/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests/job/dep1" ],
    "setupFile" : "/home/travis/build/Netflix/genie/genie-web/build/resources/test/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests/job/jobsetupfile",
    "commandArgs" : "-c 'cat query.sql'",
    "clusterCriterias" : [ {
      "tags" : [ "localhost" ]
    } ],
    "commandCriteria" : [ "bash" ],
  },
  files={
    "attachment": (
      'query.sql',
      'select count(1) from small_table;',
      'application/octet-stream'
    ),
  },
)

За исключением случаев, если существует files, он игнорирует json a, если я изменю json на data it 'будет форма.Я мог бы переместить JSON dict в files dict, но, похоже, он не обрабатывается как JSON, и теперь мне нужно использовать пакет для его кодирования?

Я спрашиваю, потому что с обработкой requestsjson в аргументе и объекте ответа. Я подозреваю, что он будет обрабатывать его где-нибудь и для многочастной формы, в противном случае я добавлю json только для json.dumps(...)

Дополнительно:

  1. Похоже, нет способа отправить более одной части с именем attachment, которую API-интерфейс разрешил бы / ожидал, если вам нужно более одного вложенного файла.[Как и в моем комментарии, это можно сделать, изменив files на список пар имя-файл-список].
  2. В примере запросов показано, что заголовки деталей имеют имена без кавычек, такие как Content-Disposition: form-data; name=request иContent-Disposition: form-data; name=attachment в то время как пакет запроса, похоже, генерирует Content-Disposition: form-data; name="attachment".

1 Ответ

1 голос
/ 22 мая 2019

«Я мог бы переместить JSON-диктат в файлы, но, похоже, он не обрабатывается как JSON»

  1. Вы можете записать файл dict в файлы JSON на диске.

tempfile.TemporaryFile можно использовать. Дамп, запрос, очистка и повтор

«В противном случае я привожу json только для json.dumps (...)»

  1. Это можно сделать, если вам нужно сохранить контроль и запрос, построенный во время выполнения (игнорируйте 1 для этого варианта использования). Однако не забудьте преобразовать дампы в объекты io.BytesIO, чтобы запросы могли вычислять заголовок длины содержимого.

Кроме того, не забудьте передать тип содержимого для файлов как «application / octet-stream», а не «plain / text»

"Примеры запросов показывают, что заголовки деталей имеют имена без кавычек"

Я не думаю, что это должно иметь значение. RFC 2183 документирует, что значения параметров длиной <78, но содержащие tspecials <a href="https://tools.ietf.org/html/rfc2119" rel="nofollow noreferrer"> должны быть представлены в виде строки в кавычках.

Хотя значение параметра name не включает tspecials, это более надежная обработка для коротких значений IMO.

...