Python请求:多部分,一部分作为json

丹布林

Netflix的精灵API要么采用JSON或者一个部分requestapplication/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,如果我更改jsondata表单。我可以将JSON dict移到filesdict上,但是它似乎没有作为JSON处理,现在我需要使用该包对其进行编码?

我问是因为requests在参数和响应对象中处理json时,我怀疑它也会在多部分表单的某个地方处理它,否则我json只是为了json.dumps(...)

另外:

  1. 似乎没有一种方法可以发送一个以上的名称attachment,如果您需要多个附件,api将允许/期望该名称[正如我的评论,可以通过更改files为列表名称与文件对的列表来完成]。
  2. 请求示例显示零件标题的名称未加引号Content-Disposition: form-data; name=requestContent-Disposition: form-data; name=attachment而请求包似乎会生成Content-Disposition: form-data; name="attachment"
Oluwafemi Sule

“我可以将JSON dict移到文件dict中,但它似乎没有作为JSON处理”

  1. 您可以将字典转储到磁盘上的JSON文件中。

tempfile.TemporaryFile可以使用。转储,请求,清理并重复

“否则,我只为json.dumps(...)引入json”

  1. 如果需要保留dict并在运行期间建立请求(可以忽略此用例的1),则可以这样做。但是,请记住将转储转换为io.BytesIO对象,以便请求可以计算内容长度标头。

另外,请记住将文件的内容类型传递为“ application / octet-stream”而不是“ plain / text”

“示例请求显示零件标题具有未引用的名称”

我认为这不重要。RFC 2183文档指出,长度<78但包含tspecials的参数值表示为带引号的字符串。

尽管name参数的值不包含tspecials,但对于短值IMO而言,这是更健壮的处理方式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将JSON作为多部分POST请求的一部分发送

将QMap的一部分作为QVector

使用GLTF的一部分作为InstancedMesh

将Canvas的一部分作为位图

代码的一部分作为模板参数

如何在Paw中将文件作为多部分请求的一部分上载?

python:使用字典键的一部分作为字典值的变量

将字符串的一部分作为代码pandas/python 执行

从文本中获取一行的一部分作为字符串

如何创建仅以列的一部分作为索引的数据透视表?

获取当前网址并将其一部分作为变量传递

是否可以将向量的一部分作为向量发送给函数?

Dovecot Sieve - 如何将消息的一部分作为变量检索

如何获取html标记的一部分作为变量

如何使用数组值的一部分作为新数组的键?

OpenLiteSpeed:使用重写规则获取 URL 的最后一部分作为 GET 参数

如何传递* interface {}的一部分作为参数?

使用类名称的一部分作为.addClass的变量

为什么bash数组的一部分作为命令执行?

用 Pandas 列替换字符串的一部分作为模式

无法将 std::array 的一部分作为模板引用类型参数传递

将vuex存储的一部分作为操作的负载分发是正确的吗?

将nginx url的一部分作为“变量”?

IcCube-使用多维数据集的一部分作为透视图

ReactJS - 将 onClick 函数的一部分作为来自父组件的道具传递

shell为什么将$(<file)输出的一部分作为命令处理?

将数组的一部分作为函数参数传递

操纵 API 响应以将对象的一部分作为键?

如何在 Kubernetes 入口控制器中将请求 uri 的一部分作为自定义标头传递