通过Python urllib3向Azure IoT Hub发HTTPS消息无响应问题咨询
问题1解答
- Azure IoT Hub 设备事件发送成功后返回的标准成功响应为
204 No Content,该响应不存在任何响应体内容,不属于字符串类型,仅携带HTTP状态码和必要响应头,没有payload数据。 - 你发送的消息体本身不会随响应返回,仅可通过你提到的Device Explorer工具、Azure IoT SDK读取、Azure Portal三个渠道查询。
问题2解答
urllib3和urllib2并非没有获取到响应,是你代码中的两处问题导致看起来没有响应输出:
- 类型拼接错误:Python 3中
httpResponse.read()返回的是bytes类型,直接和字符串拼接会触发TypeError异常,如果你没有做异常捕获,代码会直接中断执行,产生没有收到响应的错觉。 - 204响应特性:
204 No Content本身设计就是无返回内容,就算你处理了类型问题,调用read()拿到的也是空字节,打印后也看不到内容,容易误认为没有返回。 - 额外小问题:你原有代码里用
datetime = datetime.datetime.now()覆盖了datetime模块名,后续如果再调用datetime模块的方法会触发异常,也建议修正。
你可以通过打印响应状态码的方式直接验证是否拿到成功响应,修正后的完整代码参考如下:
import urllib3 import json import datetime import ssl import certifi print("certifi: " + certifi.where()) print("urllib3 ver: " + urllib3.__version__) print("ssl ver: " + ssl.OPENSSL_VERSION) # IoT DeviceID deviceID = "gwy1" # Iot Hub Name IoTHubName = "aziothub1" # RestAPI Version iotHubAPIVer = "2020-03-13" iotHubRestURI = "https://" + IoTHubName + ".azure-devices.net/devices/" + deviceID + "/messages/events?api-version=" + iotHubAPIVer SASToken = "SharedAccessSignature sr=gwy1-aziothub1.azure-devices.net%2Fdevices%2Fglualwpr-gwy1&sig=v-----------------------------------&se=1629182336" # Message Payload current_datetime = datetime.datetime.now() body = {} body['datetime'] = str(current_datetime) body['deviceClient'] = deviceID body['Message'] = 'Python Device to Cloud Message over HTTPS' encoded_body = json.dumps(body) # Headers Headers = { 'Content-type' : 'application/json', 'Authorization' : SASToken } http = urllib3.PoolManager(ssl_version=ssl.PROTOCOL_TLSv1_2) httpResponse = http.request('POST', iotHubRestURI, headers=Headers, body=encoded_body) # 修正后的输出逻辑 print("响应状态码:", httpResponse.status) resp_content = httpResponse.read().decode('utf-8') print("响应内容:", resp_content if resp_content else "无响应内容(204 No Content 属正常现象)")
内容的提问来源于stack exchange,提问作者GHariz
相关产品推荐
相关产品推荐

