XML响应中的奇怪字符

时间:2014-11-19 11:36:37

标签: python xml sockets http post

我尝试使用XML over HTTP与我们的供应商沟通。

到目前为止,我的要求是:

POST /some-service HTTP/1.1
Host: me
Content-Type: text/xml; charset=utf-8
Content-Length: 470

<?xml version="1.0" ?>
<PNARequest>
    <Version>2.0</Version>
    <TransactionHeader>
        <SenderID>My Company</SenderID>
        <ReceiverID>My Supplier</ReceiverID>
        <CountryCode>FR</CountryCode>
        <LoginID>My Login</LoginID>
        <Password>My Password</Password>
        <TransactionID>some hexa numbers</TransactionID>
    </TransactionHeader>
    <PNAInformation Quantity="1" SKU="more numbers here"/>
    <ShowDetail>2</ShowDetail>
</PNARequest>

(内容长度可能有所不同,因为我在粘贴之后改变了身体。)

我将其发送到供应商的端口443,没有加密(测试目的)。 之前,我有一个正确的响应,具有良好的XML结构。现在,作为回应我只能这样做:

'\x15\x03\x00\x00\x02\x02\n'

我用Python显示了这个:print repr(response)

这是完整的反应,而不仅仅是身体。没有标题,没有这样的。

在供应商方面,他们甚至不会在他们的日志中看到我的请求。那么,有什么进展的线索?任何帮助将不胜感激。

谢谢!

更新

这是我发送此请求的Python代码(请注意,这只是一个测试通信过程的脚本,看看真正交换的内容):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import socket

def condense(body):
    body = re.sub(' +<','<', body)
    return body.replace('\n', '')

def post(host, port, api, body, content_type="text/xml; charset=utf-8", 
         me="my.ip"):
    body = condense(body)
    lines = [
        "POST {} HTTP/1.1".format(api),
        "Host: {}".format(me),
        "Content-Type: {}".format(content_type),
        "Content-Length: {}".format(len(body)),
        "",
        "{}".format(body),
        "",
        "",
    ]
    msg = "\r\n".join(lines)

    s = socket.create_connection((host, port))
    s.send(msg)
    print "REQUEST ##############################################"
    print msg

    res = ""
    data = True
    while data:
        data = s.recv(8192)
        res += data

    s.close()
    print "RESPONSE #############################################"
    print res
    print 


def unpack_post(d, **kwargs):
    post(d["host"], d["port"], d["api"], d["body"], **kwargs)

my_supplier = {
    "host": "my.supplier.com",
    "port": 443,
    "api": "/some-api",
    "body": """<?xml version="1.0" ?>
<PNARequest>
    <Version>2.0</Version>
    <TransactionHeader>
        <SenderID>Your Company</SenderID>
        <ReceiverID>My Supplier</ReceiverID>
        <CountryCode>FR</CountryCode>
        <LoginID>My Login</LoginID>
        <Password>My Password</Password>
        <TransactionID>Some Hexa Numbers</TransactionID>
    </TransactionHeader>
    <PNAInformation Quantity="1" SKU="More Numbers Here"/>
    <ShowDetail>2</ShowDetail>
</PNARequest>""",
}

if __name__ == "__main__":
    unpack_post(my_supplier)

我知道这有点难看,但我这样做仅仅是为了测试目的所以...... 我编写此代码是因为我喜欢在多个服务器上进行测试,例如https://www.200please.com/,...

1 个答案:

答案 0 :(得分:0)

所以,正如我在其中一条评论中所说,这可能是由于服务器方面的问题。

我知道这不是一个完美的答案,但由于我的供应商不与我分享他们的日志,我可以猜测......

我稍后会编辑这个答案,如果我找到新的东西要分享,但我不会因为这不再是一个编程问题(再次,我想这里),那不是那个地方。