HTTP POST 请求和带有 MIME 附件多部分/相关和 xop 的标头?

2024-01-10

我正在尝试使用 eBay 的 FileTransfer API 上传批量数据交换调用。 为了做到这一点,我必须将 xml 请求字符串发布到 eBay 服务器,但 xml 请求包含一个<Data>必须包含您正在传输的数据的部分(在本例中,它是包含另一个 xml 文档的 base64 编码的 zip 文件)。 eBay 给出了一个 C# 示例来说明如何构建这样的文档:https://ebay.custhelp.com/app/answers/detail/a_id/1561 https://ebay.custhelp.com/app/answers/detail/a_id/1561

我一直在尝试使用 httplib 在 python 中重新创建这个示例,以 POST 我以与示例大致相同的方式构建的字符串(3 个 UUID 是唯一的):

request = """
--MIMEBoundaryurn_uuid_{XMLUUID}
    Content-Type: application/xop+xml;charset=UTF-8;type="text/xml;charset=UTF-8";
    Content-Transfer-Encoding: binary
    Content-ID:<0.urn:uuid:{REQUUID}>
    <?xml version="1.0" encoding="utf-8"?>
    <uploadFileRequest xmlns:sct=\"http://www.ebay.com/soaframework/common/types\" xmlns="http://www.ebay.com/marketplace/services">
    <fileAttachment>
        <Size>{Size}</Size>
        <Data><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
        href="cid:urn:uuid:{ATTCHMNTUUID}>"</Data>
    </fileAttachment>
    <fileFormat>{fileFormat}</fileFormat>
    <fileReferenceId>{fileReferenceId}</fileReferenceId>
    <taskReferenceId>{taskReferenceId}</taskReferenceId>
    </uploadFileRequest>
    --MIMEBoundaryurn_uuid_{XMLUUID}
    Content-Type: application/octet-stream
    Content-Transfer-Encoding: binary
    Content-ID: <urn.uuid:{ATTCHMNTUUID}>\r\n
    {Data}
    --MIMEBoundaryurn_uuid_{XMLUUID}--
    """.replace("\t", "")

request_dict = {
    'Size': size,
    'Data': payload,
    'fileFormat': 'zip',
    'fileReferenceId': '50000935383',
    'taskReferenceId': '50000847753',
    'REQUUID': reqUUID,
    'XMLUUID': xmlUUID,
    'ATTCHMNTUUID': attchmntUUID,
}


request = request.format( **request_dict )

标题看起来像这样:

headers = {
'X-EBAY-SOA-OPERATION-NAME': 'uploadFile',
'X-EBAY-SOA-SERVICE-NAME': 'FileTransferService',
'X-EBAY-SOA-SECURITY-TOKEN': #Auth Token,
'Content-type': "multipart/related; boundary=" + boundary  + ";type=\"application/xop+xml\";start=\"<0." + "urn:uuid:" + str(requuid) + ">\";start-info=\"text/xml\""
}

然后是我的帖子:

connection = httplib.HTTPSConnection( 'storage.sandbox.ebay.com' )
connection.request( "POST", '/FileTransferService', request, headers )

当我发布不带 MIME 附件信息的 xml 请求时,它会毫无问题地接受该文件。但是当我尝试像上面的代码那样使用 MIME 多部分/相关附件和<xop>标签指出数据在附件中的位置,POST 不成功,我收到“错误 302:暂时移动”响应。这让我相信我构建 MIME 多部分/相关 xml 请求的方式,或者我构建“Content-type”标头声明的方式,或者我对 xop 的使用,或者很可能是所有三者的组合,有些东西是不正确的事物。

我想我的问题是:如何创建包含 MIME 多部分/相关部分并且还使用 xop 的 xml 请求?

谢谢您的帮助!

Wes


我发现我的要求出了什么问题。它是构造请求字符串和标头的组合。我采用了一种更有组织性和程序性的方法来实现它,并且它奏效了。

构建请求字符串的部分如下所示:

###########################################
# UUIDs
###########################################
reqUUID= uuid.uuid4()
attchmntUUID = uuid.uuid4()

##########################################
# MIME strings
##########################################
URN_UUID_REQUEST = "<0.urn:uuid:%s>"% reqUUID
URN_UUID_ATTACHMENT = "urn:uuid:%s" % attchmntUUID
MIME_BOUNDARY = "MIME_boundary"

request_dict = {
    'Size': size,
    'Data': payload,
    'fileFormat': 'gzip',
    'fileReferenceId': '50000945773',
    'taskReferenceId': '50000858033',
    'REQUUID': reqUUID,
    'ATTCHMNTUUID': attchmntUUID,
}


def build_request( request_dict):
    '''
    Build the request string with MIME Attachment
    '''

    request  = '<uploadFileRequest xmlns:sct="http://www.ebay.com/soaframework/common/types" xmlns="http://www.ebay.com/marketplace/services">\r\n'
    request += '<taskReferenceId>%s</taskReferenceId>\r\n' % request_dict['taskReferenceId']
    request += '<fileReferenceId>%s</fileReferenceId>\r\n' % request_dict['fileReferenceId']
    request += '<fileFormat>%s</fileFormat>\r\n' % request_dict['fileFormat']
    request += '<fileAttachment>\r\n'
    request += '<Size>%s</Size>\r\n'% request_dict['Size']
    request += '<Data><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:%s"/></Data>\r\n'%URN_UUID_ATTACHMENT
    request += '</fileAttachment>\r\n'
    request += '</uploadFileRequest>\r\n'

    return request


def build_mime_message( request, data ):
    '''
    Build the xml string with MIME attachments and the base64 encoded data string
    '''

    request_part  = '\r\n'
    request_part += '--%s\r\n' % MIME_BOUNDARY
    request_part += 'Content-Type: application/xop+xml; charset=UTF-8; type="text/xml; charset=UTF-8"\r\n'
    request_part += 'Content-Transfer_Encoding: binary\r\n'
    request_part += 'Content-ID: %s\r\n\r\n' % URN_UUID_REQUEST
    request_part += '%s\r\n' % request


    binary_part  = '\r\n'
    binary_part += '--%s\r\n' % MIME_BOUNDARY
    binary_part += 'Content-Type: application/octet-stream\r\n'
    binary_part += 'Content-Transfer-Encoding: base64\r\n'
    binary_part += 'Content-ID: <%s>\r\n\r\n' % URN_UUID_ATTACHMENT
    binary_part += '%s\r\n' % data
    binary_part += '--%s--' % MIME_BOUNDARY

    return request_part + binary_part

request = build_request( request_dict )
request = build_mime_message( request, data )#data is base64 encoded gzip compressed xml file

标题看起来像这样:

content_type_string  = 'multipart/related;'
content_type_string += ' boundary=%s;' % MIME_BOUNDARY
content_type_string += ' type="application/xop+xml";'
content_type_string += ' start="%s";' % URN_UUID_REQUEST
content_type_string += ' start-info="text/xml"'

headers = {
'X-EBAY-SOA-OPERATION-NAME': 'uploadFile',
'X-EBAY-SOA-SERVICE-NAME': 'FileTransferService',
'X-EBAY-SOA-SECURITY-TOKEN': #auth token,
'Content-Length': len( request ),
'Content-Type': content_type_string
}

因此,从所有这些来看,我发现问题出在标头和请求中的换行符和制表符上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP POST 请求和带有 MIME 附件多部分/相关和 xop 的标头? 的相关文章

  • QSortFilterProxyModel + QAbstractItemModel modelIndex.internalPointer() 导致崩溃

    我在 PyQt 4 8 Python 2 7 中实现了自己的 QAbstractItemModel class FriendListModel QtCore QAbstractItemModel def init self groups c
  • 如何将经度和纬度转换为国家或城市?

    我需要将经度和纬度坐标转换为国家或城市 python中有这样的例子吗 提前致谢 我使用谷歌的API from urllib2 import urlopen import json def getplace lat lon url http
  • 按 ListProperty (NDB) 对查询进行排序

    如何按 ListProperty 对查询进行排序 该模型 class Chapter ndb Model title ndb StringProperty required True version ndb IntegerProperty
  • C# Xml-使用 IXmlSerialized 序列化派生类

    我有一个与 XML 序列化兼容的基类和一个实现 IXmlSerialized 的派生类 在此示例中 基类确实实现了 IXmlSerializable using System Diagnostics using System Text us
  • Keras,如何获取每一层的输出?

    我已经用 CNN 训练了一个二元分类模型 这是我的代码 model Sequential model add Convolution2D nb filters kernel size 0 kernel size 1 border mode
  • 01 无效令牌[重复]

    这个问题在这里已经有答案了 嘿 学习 python3有一段时间了 遇到字典和dictionary name get 方法并尝试获取随机键值 问题 data data get key 1 它有效并且返回 1 但如果我使用data get ke
  • 使用 K 均值聚类 OpenCV 进行交通标志分割

    I used K Means Clustering to perform segmentation on this traffic sign as shown below 这些是我的代码 读取图像并模糊 img cv imread 000
  • Python 中的二进制相移键控

    我目前正在编写一些代码 以使用音频转换通过激光传输消息 文件 和其他数据 我当前的代码使用 python 中 binascii 模块中的 hexlify 函数将数据转换为二进制 然后为 1 发出一个音调 为 0 发出不同的音调 这在理论上是
  • 用于打印 C/C++ 文件的所有函数定义的 Python 脚本

    我想要一个 python 脚本来打印 C C 文件中定义的所有函数的列表 e g abc c定义两个函数为 void func1 int func2 int i printf d i return 1 我只想搜索文件 abc c 并打印其中
  • Python NLP 英式英语与美式英语

    我目前正在用Python 进行NLP 工作 然而 在我的语料库中 既有英式英语也有美式英语 实现 实现 我正在考虑将英式英语转换为美式英语 但是 我没有找到一个好的工具 包来做到这一点 有什么建议么 我也找不到包 但试试这个 请注意 我必须
  • keras 预测内存交换无限期增加

    我使用keras实现了一个分类程序 我有一大组图像 我想使用 for 循环来预测每个图像 然而 每次计算新图像时 交换内存都会增加 我尝试删除预测函数内部的所有变量 并且我确信该函数内部存在问题 但内存仍然增加 for img in ima
  • 如何在Python中正确声明ctype结构+联合?

    我正在制作一个二进制数据解析器 虽然我可以依靠 C 但我想看看是否可以使用 Python 来完成该任务 我对如何实现这一点有一些了解 我当前的实现如下所示 from ctypes import class sHeader Structure
  • 如何创建指向指针数组的 Python ctypes 指针

    我需要学习如何处理char 在下面的 C 方法中通过 Python ctypes 我通过使用调用其他只需要单个指针的方法做得很好create string buffer 但此方法需要一个指向指针数组的指针 ladybugConvertToM
  • 如何在 Numpy 中实现垃圾收集

    我有一个名为main py 它引用另一个文件Optimisers py它仅具有功能并用于for循环进入main py 这些函数都有不同的优化功能 This Optimisers py然后引用另外两个类似的文件 其中也只有函数 它们位于whi
  • 散景中的时间序列流

    我想在散景中绘制实时时间序列 我只想在每次更新时绘制新的数据点 我怎样才能做到这一点 散景网站上有一个动画情节的示例 但它每次都需要重新绘制整个图片 另外 我正在寻找一个简单的示例 我可以在其中逐点绘制时间序列的实时绘图 散景效果0 11
  • 写入 UDP 套接字会被阻塞吗?

    如果是的话 在什么条件下 或者 换句话说 在twisted 中运行此代码是否安全 class StatsdClient AbstractStatsdClient def init self host port super StatsdCli
  • Pandas - 分割大的Excel文件

    我有一个大约有 500 000 行的 Excel 文件 我想将其拆分为多个 Excel 文件 每个文件有 50 000 行 我想用熊猫来做 这样它会是最快和最简单的 有什么想法如何制作吗 感谢您的帮助 假设您的 Excel 文件只有一个 第
  • 通过子类化 `io.TextIOWrapper` 来子类化文件 - 但它的构造函数有什么签名?

    我正在尝试子类化io TextIOWrapper下列的这个帖子 https stackoverflow com a 23796737 974555 虽然我的目标不同 以此开始 注意 动机 https stackoverflow com a
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • 在 pip 中为 Flask 应用程序构建 docker 映像失败

    from alpine latest RUN apk add no cache python3 dev pip3 install upgrade pip WORKDIR backend COPY backend RUN pip no cac

随机推荐

  • 如何使用 nvm-windows 同时运行两个不同的节点版本?

    问题 我们需要在两个不同的应用程序上同时运行和使用两个不同的节点版本 即 14 12 以支持使用 npm run dev npm install具有相应定义版本的命令 到目前为止我们尝试过的步骤 Created nvmrc每个应用程序上定义
  • 有关从一台设备到另一台设备的 Android 内核移植的指南

    我拥有一台 Samsung Galaxy 3 并且想要移植可用于其他 Android 设备的内核 我已经准备好了所有的建筑环境 我也有C知识 我到底不明白的是移植涉及什么以及如何以及什么 哪些代码应该以什么方式修改 如果有人可以帮助我 这会
  • 对象不继承原型函数

    我有一个构造函数 它充当超类 Bla function a this a a 我将其原型化为包含一个简单的方法 Bla prototype f function console log f 现在新的Bla 1 f 将在控制台中记录 f 但是
  • Pytorch 无法将训练好的模型导出为 ONNX

    我一直在使用多个卷积层 3x3 步长 1 填充相同 在 Pytorch 框架中训练模型 该模型表现良好 我想在 Matlab 中使用它进行推理 为此 框架之间的 NN 交换的 ONNX 格式似乎是 唯一的 解决方案 可以使用以下命令导出模型
  • 使用什么机器实例在 Google Cloud Platform 中运行 GPU 工作负载 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在尝试运行 Elasticsearch BERT 应用程序 并想了解使用 GPU 微调模型的最小配置 我应该使用什么机器配置 参考githu
  • C++ 操作符删除失败,如果不能,为什么?

    在内存解除分配期间 操作符删除是否可以抛出异常或以其他方式发出错误信号 以其他方式是否有可能operator delete失败 在这种情况下它的默认行为是什么 ISO 标准对此有何规定 例如在 Windows 操作系统中 C operato
  • SASS:生成的 CSS 不是最佳的

    我正在努力学习SASS 我让这个代码片段工作了 但在我看来生成的 css 很糟糕 我希望所有这些 css 都放在同一个 container 中 没有三个不同 如下所示 SASS container extend clearfix exten
  • 如何检查 json 中的所有键是否都等于 true

    如何检查 json 对象中的所有键是否都等于 true 我的对象看起来像这样 success first name false middle name false last name false d o b false sex false
  • ansible、命令模块和带管道的 jq

    我正在尝试运行一个返回容器列表及其大小的 docker 命令 命令是docker container ls format name Names size Size all jq slurp 当我尝试在 Ansible 剧本中运行它时 它会爆
  • SSIS 导入 Excel 日期时出错(截断错误)

    我很抱歉发布了一个看似非常简单的问题 但我找不到答案 而且我浪费了几天 此时不仅仅是几个小时 我对 SSIS 还很陌生 它只是让我感到不舒服 背景 非常简单的 SSIS 包 用于将 Excel 工作表导入 SQL Server 中的临时表
  • 使用Python获取视频属性,无需调用外部软件

    更新 是的 有可能 现在大约 20 个月后了 请参阅下面的更新3 更新 这真的不可能吗 我能找到的只是调用 FFmpeg 或其他软件 的变体 我当前的解决方案如下所示 但我真正想要的可移植性是一个仅 Python 的解决方案 不需要用户安装
  • 如何在Python ElementTree中插入子子元素

    我的 XML
  • 单个 MSI 安装正确的 32 或 64 位 C# 应用程序

    我有一个为 x86 32 位 和 x64 64 位 平台构建的 C 应用程序 我的构建系统当前输出 两个 MSI 安装程序 每个平台一个 为了以防万一 我的 C 应用程序包含一个 Windows 任务栏工具栏 这意味着安装的 DLL 必须由
  • CoInitializeEx 用于 boost::test::unit_test

    有一天 我决定需要了解 Windows 平台上的 C 测试驱动开发 使用 Visual Studio 2010 Premium 在决定尝试 boost 的单元测试框架之前 我环顾四周 我应该说我选择了 boostpro com 的版本 如果
  • 如何使用Python多进程apply_async获得精确的超时?

    我正在使用多进程池并行运行一批作业 我想给每项工作2秒的时间限制 也就是说 如果一项工作花费的时间超过 2 秒 我想终止该工作并继续执行下一项工作 这是我的代码 from multiprocessing import Pool Timeou
  • 为模型创建通用 Save() 方法

    我有一个相当简单的系统 出于这个问题的目的 基本上由三个部分组成 模型 存储库 应用程序代码 核心是模型 让我们使用一个简单的例子 public class Person public string FirstName get set pu
  • 如何正确关闭IPython Notebook?

    如何正确关闭IPython Notebook 目前 我只需关闭浏览器选项卡 然后使用Ctrl C在终端中 不幸的是 两者都没有exit 也不滴答作响Kill kernel upon exit确实有帮助 他们确实杀死了内核 但不退出 iPyt
  • 实体关系 - 弱实体能否作为“一”参与“一对多”关系

    通过以下实体关系结构 我很难弄清楚 LOAN 和 ITEM 实体之间的关系是否有效 LOAN 的弱实体使用部分键 loan dateLeant 以及来自 CUSTOMER 和 ITEM 的主键来形成 LOAN 主键 然而 LOAN 与 IT
  • java执行linux命令

    我试图从 java 代码执行 linux 命令 cat 但它不起作用 Runtime getRuntime exec cat home roman logs 它对于单文件的猫效果很好 Runtime getRuntime exec cat
  • HTTP POST 请求和带有 MIME 附件多部分/相关和 xop 的标头?

    我正在尝试使用 eBay 的 FileTransfer API 上传批量数据交换调用 为了做到这一点 我必须将 xml 请求字符串发布到 eBay 服务器 但 xml 请求包含一个