【问题标题】:how python http request and response workspython http请求和响应如何工作
【发布时间】:2010-04-12 06:28:39
【问题描述】:

我是 python 的新手,我有任务,所以我需要扫描 wifi 并将数据发送到服务器,以下是我必须发送的格式,在浏览器 url 文本中手动输入时可以正常工作盒子,

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()

谢谢

【问题讨论】:

  • 如果您有新问题,请使用“新问题”按钮。 :) 原问题链接:stackoverflow.com/revisions/…
  • 第二。回滚编辑。
  • 我需要一些关于响应生成的帮助,以便在类加载的生命周期内只做出一次响应

标签: python http


【解决方案1】:

很可能,您在问题中发布的脚本的问题是您不能直接这样做:

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

异常在getaddrinfo()中触发,调用C函数getaddrinfo()返回EAI_NONAME

节点或服务未知;或者节点和服务都为NULL;或在hints.ai_flags 中指定了AI_NUMERICSERV,并且服务不是数字端口号字符串。”

显然,传递给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'

【讨论】:

  • 嗨,兄弟,我有 1 个概率,当我使用硬编码方法时,数据可以发送到服务器,但是当我使用非硬编码方法时,我遇到了 Traceback 错误(大多数最近通话最后):文件“scan.py”,第 71 行,在 request.add_data(urllib.urlencode(query_args)) 文件“/usr/lib/python2.6/urllib.py”,第 1254 行,在urlencode raise TypeError TypeError: not a valid non-string sequence or mapping object 你能帮我吗?
  • 我需要一些关于响应生成的帮助,以便在类加载的生命周期内只做出一次响应
【解决方案2】:

代替:

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)

不确定它是否能解决您的所有问题,但至少您的代码将符合方法/构造函数签名。

【讨论】:

    【解决方案3】:

    回溯不是来自您粘贴的相同代码。

    在错误回溯中有一行:

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

    这是http.py 的第 9 行,但它不在您粘贴的代码上。

    请粘贴实际代码。

    【讨论】:

    • 对不起nosklo,实际上我正在使用示例代码进行测试,我错误地粘贴了不同的代码,我已经编辑了代码,你能帮我为上述格式的不同参数发布http帖子吗,谢谢
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2012-08-09
    • 1970-01-01
    • 2013-03-25
    • 2011-02-23
    相关资源
    最近更新 更多