HTTP POST请求和带有MIME附件multipart/related和xop的标头? [英] HTTP POST request and headers with MIME attachments multipart/related and xop?

查看:113
本文介绍了HTTP POST请求和带有MIME附件multipart/related和xop的标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用其FileTransfer API将批量数据交换调用上载到eBay. 为此,我必须将xml请求字符串发布到eBay服务器,但是xml 请求包含一个<Data>部分,该部分必须包含您要传输的数据(在这种情况下,这是一个base64编码的zip文件,其中包含另一个xml文档). eBay在C#中提供了一个有关如何构造此类文档的示例: https://ebay .custhelp.com/app/answers/detail/a_id/1561

I'm trying to upload a bulk data exchange call to eBay using their FileTransfer API. In order to do this, I've got to POST an xml request string to the eBay server but the xml request contains a <Data> section that must include the data you're transferring( in this case it's a base64 encoded zipfile containing another xml document). eBay gives an example in C# of how to construct such a document: https://ebay.custhelp.com/app/answers/detail/a_id/1561

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

I've been trying to recreate this example in python using httplib to POST a string I've constructed in much the same fashion as the example(the 3 UUIDs are unique):

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\""
}

然后是我的POST:

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

当我发布不带MIME附件信息的xml请求时,它毫无问题地接受该文件.但是,当我尝试像上面的代码一样执行此操作时,如果使用MIME multipart/相关附件和<xop>标签指出数据在附件中的位置,则POST不会成功,并且会出现错误302:已移动暂时"回应.这使我相信,与我构造MIME多部分/相关xml请求的方式,我构造"Content-type"标头声明的方式,我对xop的使用或所有这三者的组合都不对劲事情.

When I post the xml request without the MIME attachment information it accepts the file with no problems. But when I try to do it like the above code, with MIME multipart/related attachments and the <xop> tag pointing out where the data is located in the attachment, the POST isn't successful and I get a "Error 302: Moved Temporarily" response. This leads me to believe that something isn't right with how I constructed the MIME multipart/related xml request, or how I constructed the "Content-type" header declaration, or my use of xop, or most likely a combination of all three things.

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

I guess my question is: How do I create an xml request that contains MIME multipart/related sections and also uses xop?

感谢您的帮助!

Wes

推荐答案

我知道我的请求出了什么问题.它是构造请求字符串和标头的组合.我采用了一种更具组织性和编程性的方法,并且有效.

I figured out what was wrong with my request. It's a combination of constructing the request string and also the headers. I went with a much more organized and programmatic approach to it, and it worked.

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

Here's what the section that builds the request string looks like:

###########################################
# 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
}

因此,从所有这些信息中,我收集到问题出在标题和请求中的换行符和制表符之间.

So from all of this, I gathered that the problem was with the newlines and the tab characters in both the header and request.

这篇关于HTTP POST请求和带有MIME附件multipart/related和xop的标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆