从Python中的字符串创建HTTP对象

2024-10-03 21:24:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我的设备正在向我的RaspberryPi发送以下http消息:

POST /sinvertwebmonitor/InverterService/InverterService.asmx/CollectInverterData HTTP/1.1
Host: www.automation.siemens.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 349

xmlData=<rd><m>xxxxx</m><s>yyyyyy</s><d t="1483019400" l="600"><p i="1">460380AE</p><p i="2">43655DE7</p><p i="3">4212C986</p><p i="4">424805BC</p><p i="5">4604E3D1</p><p i="6">441F616A</p><p i="7">4155E7F5</p><p i="8">E1</p><p i="9">112</p><p i="C">153</p><p i="D">4</p><p i="E">11ABAC</p><p i="F">22A48C</p><p i="10">0</p></d></rd>

我无法更改设备上的任何内容。在

在RaspberryPi上,im运行一个脚本来监听和接收来自套接字的消息。 到目前为止,这是有效的,收到的消息是上面的消息。在

现在,我想从这个消息创建一个HTTP对象,然后轻松地提取头、内容等。 类似于以下示例:

^{pr2}$

然而,没有“获取”一个网址。我只想看看我已经有了那根绳子。在

伪示例:

r = requests.read(hereComesTheString)
r.status_code

我希望这个问题可以理解。在

很乐意得到一些提示。在

谢谢并致以诚挚的问候, 克里斯托夫


Tags: httphost消息示例内容wwwrdcontent
3条回答

如果您使用的是纯socket服务器,那么您需要实现一个HTTP服务器,这样您就可以根据协议分割请求和响应。在

使用现有的HTTP服务器和app服务器可能更容易。烧瓶适用于:

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route("/sinvertwebmonitor/InverterService/InverterService.asmx/CollectInverterData", methods=['POST'])
def dataCollector():
    data = request.form['xmlData']
    print(data)
    # parseData. Take a look at ElementTree

if __name__ == "__main__":
    app.run(host=0.0.0.0, port=80)

谢谢奥尔登。在代码下面进行一些更改,以便它可以与Python3配合使用。在

import email
from io import StringIO

request = """POST /sinvertwebmonitor/InverterService/InverterService.asmx/CollectInverterData HTTP/1.1
Host: www.automation.siemens.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 349

xmlData=<rd><m>xxxxx</m><s>yyyyyy</s><d t="1483019400" l="600"><p i="1">460380AE</p><p i="2">43655DE7</p><p i="3">4212C986</p><p i="4">424805BC</p><p i="5">4604E3D1</p><p i="6">441F616A</p><p i="7">4155E7F5</p><p i="8">E1</p><p i="9">112</p><p i="C">153</p><p i="D">4</p><p i="E">11ABAC</p><p i="F">22A48C</p><p i="10">0</p></d></rd>"""

class Request:
    def __init__(self, request):
        stream = StringIO(request)
        request = stream.readline()

        words = request.split()
        [self.command, self.path, self.version] = words

        self.headers = email.message_from_string(request)
        self.content = stream.read()

    def __getitem__(self, key):
        return self.headers.get(key, '')

r = Request(request)
print(r.command)
print(r.path)
print(r.version)

for header in r.headers:
    print(header, r[header])

print(r.content)

您在示例中使用status\u code属性,但您收到的是请求而不是响应。但是,您仍然可以创建一个简单的对象来访问请求中的数据。在

创建自己的自定义类可能最简单:

import mimetools
from StringIO import StringIO

request = """POST /sinvertwebmonitor/InverterService/InverterService.asmx/CollectInverterData HTTP/1.1
Host: www.automation.siemens.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 349

xmlData=<rd><m>xxxxx</m><s>yyyyyy</s><d t="1483019400" l="600"><p i="1">460380AE</p><p i="2">43655DE7</p><p i="3">4212C986</p><p i="4">424805BC</p><p i="5">4604E3D1</p><p i="6">441F616A</p><p i="7">4155E7F5</p><p i="8">E1</p><p i="9">112</p><p i="C">153</p><p i="D">4</p><p i="E">11ABAC</p><p i="F">22A48C</p><p i="10">0</p></d></rd>"""

class Request:
    def __init__(self, request):
        stream = StringIO(request)
        request = stream.readline()

        words = request.split()
        [self.command, self.path, self.version] = words

        self.headers = mimetools.Message(stream, 0)
        self.content = stream.read()

    def __getitem__(self, key):
        return self.headers.get(key, '')

r = Request(request)
print(r.command)
print(r.path)
print(r.version)

for header in r.headers:
    print(header, r[header])

print(r.content)

该输出:

^{pr2}$

相关问题 更多 >