【问题标题】:Micropython POST request using socket does not send data to server使用套接字的 Micropython POST 请求不向服务器发送数据
【发布时间】:2022-01-15 16:08:41
【问题描述】:

我实际上正在做一个 IOT 项目,在该项目中我使用 ESP8266 将数据发送到服务器。该代码似乎没有任何问题,但没有任何内容发送到服务器,因为客户端应用程序没有收到任何更新。但是,使用邮递员或浏览器发送数据可以正常工作。代码是用 micropython 编写的。 非常感谢您抽出宝贵时间提供帮助。

代码:

boot.py:

try:
  import usocket as socket
except:
  import socket

from machine import Pin
import network

import esp
esp.osdebug(None)

import gc
gc.collect()

ssid = 'iottollgate'
password = 'iot2017/2018'

station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

main.py:

def http_get(url):
    import socket
    _, _, host, path = url.split('/', 3)
    addr = socket.getaddrinfo(host, 80)[0][-1]
    s = socket.socket()
    s.connect(addr)
    print(addr)
    full_path = 'POST /%s HTTP/1.1\r\nHost: %s\r\n%s' % ('api/post_data.php', 'www.desopadec.org', 'l=3&t=4&v=2&c=2&l2=27&t2=2&v2=180&c2=9')
    s.send(bytes(full_path, 'utf8'))
    while True:
        data = s.recv(100)
        if data:
            print(str(data, 'utf8'), end='')
        else:
            break
    s.close()

http_get()

【问题讨论】:

    标签: http sockets iot esp8266 micropython


    【解决方案1】:
    ... 'POST /%s HTTP/1.1\r\nHost: %s\r\n%s'
    

    这不是一个有效的 POST 请求。必须有一个空行来表示 HTTP 标头的结束,即

    ... 'POST /%s HTTP/1.1\r\nHost: %s\r\n\r\n%s'
    

    除此之外,它缺少 Content-length 标头来声明正文的大小,或者使用分块传输编码。目前服务器无法确定请求正文的结束位置。

    此外,代码假定服务器将在发送响应后关闭连接。鉴于使用 HTTP/1.1 隐式宣布了对 HTTP keep-alive 的支持,服务器可能会保持连接打开,以期收到另一个请求。

    总的来说:HTTP 可能看起来很简单,但实际上是一个复杂的标准。不要猜测客户端和服务器应该做什么,而是遵循实际标准,即RFC 7230 等。

    【讨论】:

    • 非常感谢。按照您的建议在标题末尾添加一个空行解决了这样的问题:'POST /%s HTTP/1.1\r\nHost: %s\r\n\r\n%s'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2016-03-08
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多