2010-04-12 81 views
6

我是python的新手,我有任務,所以我需要掃描wifi和發送數據到服務器,下面是我必須發送的格式,這項工作很好當在瀏覽器的URL文本框中手工輸入,python http請求和響應如何工作

http://223.56.124.58:8080/ppod-web/ProcessRawData?data={"userId":"2220081127-14","timestamp":"2010-04-12 10:54:24","wifi":{"ssid":"guest","rssi":"80"}} 

這裏是我的代碼:

import httplib 
import urllib 

params = urllib.urlencode('{\"userId\":\"20081127-14\",\"timestamp\":\"2010-04-12 10:54:24\",\"wifi\":{\"ssid\":\"guest\",\"rssi\":\"80\"}}') 

headers = {"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"} 
conn = httplib.HTTPConnection("http://223.56.124.58:8080") 
conn.request("POST","ppod-web/ProcessRawData?data=",params,headers) 
response = conn.getresponse() 
print response.status 
print "-----" 
print response.reason 
data = response.read() 
print data 
conn.close() 

感謝

+0

如果您有新問題,請使用'新問題'按鈕。 :)原始問題鏈接:http://stackoverflow.com/revisions/f7804379-ffed-4ccb-bf96-b60865617396/view-source – badp 2010-04-15 11:44:50

+0

借調。回滾編輯。 – 2010-04-15 12:01:57

+0

我需要一些幫助的反應生成,使我的反應只有一次在班加載的生命期間 – 2016-01-04 06:21:49

回答

10

最有可能的,與你的問題張貼的腳本問題是你不能直接做的事:

conn=httplib.HTTPConnection("http://223.56.124.58:8080/wireless") 

異常被觸發getaddrinfo(),它調用C函數getaddrinfo()返回EAI_NONAME

The node or service is not known; or both node and service are NULL; or AI_NUMERICSERV was specified in hints.ai_flags and service was not a numeric port-number string."

顯然是有問題的參數傳遞給getaddrinfo,並且很可能您正在嘗試獲取信息用於"223.56.124.58:8080/wireless"主機。哎呀!

事實上,你不能直接連接到一個URL地址。 As the documentation clearly states and shows,您連接到服務器

conn = httplib.HTTPConnection("223.56.124.58", 8080) 

然後,你可以這樣做:

conn.request("POST", "wireless", params, headers) 

什麼腳本你實際上使用

conn.request("POST","http://202.45.139.58:8080/ppod-web",params,headers) 

即使連接是正確組成的,那也需要發送到http://202.45.139.58:8080/http://202.45.139.58:8080/ppod-web。你真的想大概是什麼:顯示

conn = httplib.HTTPConnection("202.45.139.58", 8080) 
conn.request("POST", "ppod-web", params, headers) 

錯誤此行,因爲最有可能HTTPConnection是一個懶惰的對象,只有嘗試真正連接到服務器,當你調用request()


修復上述問題後,您需要修復params

>>> urllib.urlencode({"wifi":{"ssid":"guest","rssi","80"}}) 
SyntaxError: invalid syntax 
>>> urllib.urlencode({"wifi":{"ssid":"guest","rssi":"80"}}) 
'wifi=%7B%27rssi%27%3A+%2780%27%2C+%27ssid%27%3A+%27guest%27%7D' 

要得到你認爲你想要得到的,你應該做的:

>>> urllib.urlencode({"data": {"wifi":{"ssid":"guest","rssi":"80"}}}) 
'data=%7B%27wifi%27%3A+%7B%27rssi%27%3A+%2780%27%2C+%27ssid%27%3A+%27guest%27%7D%7D' 
+0

嗨兄弟,我' m有1個概率,當我使用硬編碼的方法數據可以發送到服務器,但是當我使用不硬編碼的方法時我是gettind錯誤爲 回溯(最近調用最後一次): 文件「scan.py」 ,71行,在 request.add_data(urllib.urlencode(query_args)) 文件 「/usr/lib/python2.6/urllib.py」,線1254,在用urlencode 加薪類型錯誤 類型錯誤:沒有一個有效的非 - 字符串序列或映射對象 可以幫我嗎這個,我改變了代碼以供參考,如上 謝謝 – Apache 2010-04-15 03:01:00

+0

我需要一些幫助的響應生成使我的反應只有一次在類加載的生命期 – 2016-01-04 06:22:12

0

回溯不是來自你粘貼相同的代碼。

在錯誤追蹤有一句臺詞:

conn.request("POST","http://202.45.139.58:8080/ppod-web",params,headers) 

這是http.py的9號線,但這不是你貼的代碼。

請貼上實際的代碼。

+1

感謝您注意到這一點。 – badp 2010-04-12 07:16:40

+0

對不起nosklo,實際上我正在測試示例代碼,錯誤我粘貼從不同的,我已經編輯的代碼,可以ü幫助我的http post爲不同的參數,如上格式 ,謝謝 – Apache 2010-04-12 10:08:41

1

相反的:

conn = httplib.HTTPConnection("http://223.56.124.58:8080/wireless") 
conn.request("POST", "data", params, headers) 

嘗試:

conn = httplib.HTTPConnection("223.56.124.58", port=8080) 
conn.request("POST", "/wireless", params, headers) 

不肯定如果它將解決您的所有問題,但至少您的代碼將符合方法/構造函數簽名。