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请求中发送的值 - 我从来没有使用它。

FlaskDjangoBottle等更容易做到这一点。


编辑:与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

python——请求服务器(http请求和https请求)

python 如何建立socket长连接

在 laravel 中使用错误的 http 请求类型(例如 get 而不是 post)时返回 404

频繁的GET请求停止实际处理HTTP处理程序/离开返回相同的值