python http请求时使用GET返回成功,使用POST却返回失败
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python http请求时使用GET返回成功,使用POST却返回失败相关的知识,希望对你有一定的参考价值。
返回成功的GET请求:
url = '/mgmt?cmd=set_cmd&pid=%s&rn_cmd=%s' %(pid,rn_cmd)
con.request("GET",url)
res = con.getresponse()
print res.status
返回失败的POST请求:
params = urllib.urlencode('pid':pid,
'rn_cmd':rn_cmd)
headers = "Content-type":"application/x-www-form-urlencoded","Accept": "text/plain"
con.request("POST",'/mgmt?cmd=set_cmd',params,headers)
res = con.getresponse()
print res.status
失败信息:
File "E:\script\python\LoginServer\ls-mgmt.py", line 35, in setCmd
res = con.getresponse()
File "C:\Python27\lib\httplib.py", line 1030, in getresponse
response.begin()
File "C:\Python27\lib\httplib.py", line 407, in begin
version, status, reason = self._read_status()
File "C:\Python27\lib\httplib.py", line 371, in _read_status
raise BadStatusLine(line)
BadStatusLine: ''
请各位大侠指点迷津!不胜感激!!
【整理】关于抓取网页,分析网页内容,模拟登陆网站的逻辑/流程和注意事项
看懂了逻辑后,再去学习用工具如何抓取出来相关的逻辑:
【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
最后,再学习如何用python语言实现这些逻辑:
【教程】抓取网并提取网页中所需要的信息 之 Python版
【教程】模拟登陆网站 之 Python版(内含两种版本的完整的可运行的代码)
(这里不给贴地址,自己baidu或google搜标题即可找到我的这些帖子) 参考技术A 你访问的服务器返回的post信息无法识别,可能你的代理服务器拒绝post头信息,你在别的网路试试你的代码可能不会报错。你可以在res = con.getresponse()前面添加一句conn.set_debuglevel(1)来看看具体的信息。
以下来自 documentation for httplib:
exception httplib.BadStatusLine
A subclass of HTTPException.Raisedif a server responds with a HTTP status code that we don’t understand本回答被提问者采纳 参考技术B 正常的,因为你服务器不允许post请求,只允许get其你去,当然会失败。 参考技术C 亲,应该不是服务器的问题,不然应该有其他异常,例如返回403
Python HTTP服务器在POST和GET请求时没有响应
我需要创建一个HTTP服务器,它使用HTML页面处理Get和Post请求。我希望在Post请求中将名称和姓氏发送到服务器,然后使用Get请求显示在屏幕上。我创建了一个HTML页面,并创建了一个HTTP服务器。然而,我不确定如何使一切都连接起来。我一直在犯错。我目前收到的错误:错误代码:501
消息:不支持的方法('POST')。
错误代码说明:HTTPStatus.NOT_IMPLEMENTED - 服务器不支持此操作。
似乎问题是服务器不支持Post请求,但我不知道如何使它支持请求。
import http.server
import socketserver
PORT = 8080
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
你必须用方法Handler
创建自己的do_POST
import http.server
import socketserver
class MyHandler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
print("POST received")
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write("Hello World".encode('utf-8'))
PORT = 8080
Handler = MyHandler#http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
我测试了它
import requests
r = requests.post('http://localhost:8080')
print(r.text)
我不知道如何获取POST请求中发送的值 - 我从来没有使用它。
用Flask,Django,Bottle等更容易做到这一点。
编辑:与Flask相同。它还显示了如何获取发送的值并在响应中使用。
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
print(request.form['name'], request.form['last_name'])
return "Hello " + request.form['last_name']
return "Hello World"
app.run(port=8080)
经过测试
import requests
form = {'name': 'James', 'last_name': 'Bond'}
r = requests.post('http://localhost:8080', data=form)
print(r.text) # Hello Bond
以上是关于python http请求时使用GET返回成功,使用POST却返回失败的主要内容,如果未能解决你的问题,请参考以下文章
Python HTTP服务器在POST和GET请求时没有响应
在应用程序中发出 GET 请求时 ECONNREFUSED,但 API 成功返回 JSON