2017-04-24 26 views
0

我使用列入Digi的ConnectPort X4這裏的嵌入式Python(2.4.3)的代碼發佈到Azure的物聯網中心使用HTTPS:的urllib2不處理HTTP NO_CONTENT(204)作爲SUCESSFUL HTTPS性反應

import urllib, sys, datetime, time 
import urllib2 
iot_device_id = 'HTTP_Device' 
iot_endpoint = 'https://winiothub.azure-devices.net/devices/' + iot_device_id + '/messages/events?api-version=2016-02-03' 
sas_header = {'Authorization': 'SharedAccessSignature sr=winiothub.azure-devices.net%2Fdevices%2FHTTP_Device&sig=o7dndsA%2FJOnkzYRUhqAwMrQXVhOTpIJqJqILyGDdQAc%3D&se=1522414643'} 
while True: 
    #try: 
     body_data = { 'gateway_serial': '123', 'readingvalue':'66.00', 'date': str(datetime.datetime.now())} 
     iot_request = urllib2.Request(iot_endpoint, str(body_data), sas_header) 
     resp = urllib2.urlopen(iot_request) 
     contents = resp.read() 
     resp.close() 
     time.sleep(1) 
    #except: 
    # print 'error' 
    # time.sleep(1) 

代碼實際發佈消息到集線器,但拋出以下錯誤:

Traceback (most recent call last): 
    File "C:\Users\JeffreyBiesecker\documents\visual studio 2017\Projects\NewGateAzure\NewGateAzure\NewGateAzure2.py", line 14, in ? 
    urllib2.urlopen(iot_request) 
    File "C:\Python24\lib\urllib2.py", line 130, in urlopen 
    return _opener.open(url, data) 
    File "C:\Python24\lib\urllib2.py", line 364, in open 
    response = meth(req, response) 
    File "C:\Python24\lib\urllib2.py", line 471, in http_response 
    response = self.parent.error(
    File "C:\Python24\lib\urllib2.py", line 402, in error 
    return self._call_chain(*args) 
    File "C:\Python24\lib\urllib2.py", line 337, in _call_chain 
    result = func(*args) 
    File "C:\Python24\lib\urllib2.py", line 480, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 204: No Content 
Press any key to continue . . . 

如果在嵌入式的Digi網關或者運行代碼我在Python使用Visual Studio中運行,我得到一個錯誤版本2.4.3。

如果有人能幫助我更好地理解爲什麼我得到這個錯誤,或者有更好的方法。感謝任何幫助!我更喜歡用這種方式來捕捉錯誤。

回答

0

urllib2.HttpError包含收到的響應代碼。正因爲如此,你可以捕捉異常,測試204,如果是這樣的話,可以安全地繼續。否則,您可以處理(或重新拋出)該異常。

try: 
    resp = urllib2.urlopen(iot_request) 
except urllib2.HTTPError as e: 
    if e.code == 204: pass 
    else: raise 
+0

謝謝,我肯定會添加這段代碼。它的好主意,我想知道爲什麼204是python 2.4中的錯誤,但在2.7中沒有報告爲錯誤。我在Visual Studio中測試了這個。感謝所有幫助! –

+0

我不知道爲什麼這是一個錯誤,它似乎不直觀 - 在調試器中逐步調試urllib2可能會很有用。 –