加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python发送和接收HTTP POST

发布时间:2020-12-20 13:35:32 所属栏目:Python 来源:网络整理
导读:我正在学习 Python,我正在尝试做一些非常简单的事情:从一个应用程序发送HTTP POST并在另一个应用程序中接收它,不仅我无法让它工作,我无法得到它使用def post(self)来处理看似合理的事情.这是我的代码,它不会给出错误,但也不执行任务: 发件人申请: import
我正在学习 Python,我正在尝试做一些非常简单的事情:从一个应用程序发送HTTP POST并在另一个应用程序中接收它,不仅我无法让它工作,我无法得到它使用def post(self)来处理看似合理的事情.这是我的代码,它不会给出错误,但也不执行任务:
发件人申请:

import cgi
import webapp2
import urllib
import urllib2
import json

from google.appengine.api import urlfetch
from google.appengine.ext import webapp

senddata = {}
senddata["message"] = 'Testing the Sender'


class MainPagePost(webapp2.RequestHandler):

    def get(self):
        txt_url_values = urllib.urlencode(senddata)
        txturl = 'http://localhost:10080'
        result = urllib.urlopen(txturl,txt_url_values)
        self.redirect('http://localhost:10080') 

application = webapp2.WSGIApplication([
    ('/',MainPagePost),],debug=True)

接收申请:

import cgi
import webapp2
import urllib
import urllib2
import json

from google.appengine.api import urlfetch
from google.appengine.ext import webapp

class MainPageGet(webapp2.RequestHandler):

    def get(self):
        self.response.write('you sent:')
        con = self.request.get("message")
        self.response.write(con)

application = webapp2.WSGIApplication([
    ('/',MainPageGet),debug=True)

我在本地主机上获得的是“你发送的:”:(
最糟糕的是,我不明白为什么两个def都需要“得到(自我)”,这样我就不会得到405错误……
谢谢大家:)

这是“新”代码,对于发件人没有变化:

import cgi
import webapp2
import urllib
import urllib2
import json

from google.appengine.api import urlfetch
from google.appengine.ext import webapp

senddata = {}
senddata["message"] = 'Testing Tester'


class MainPagePost(webapp2.RequestHandler):

    def get(self):
        txt_url_values = urllib.urlencode(senddata)
        txturl = 'http://localhost:10080'
        result = urllib.urlopen(txturl,debug=True)

正如Sam建议的那样,接收器改为发布,但我得到了405:

# -*- coding: utf-8 -*-
import cgi
import webapp2
import urllib
import urllib2
import json

from google.appengine.api import urlfetch
from google.appengine.ext import webapp

class MainPageGet(webapp2.RequestHandler):

    def post(self):
        # self.response.write('you sent:')
        con = self.request.get("message")
        self.response.write('you sent: ' + con)

application = webapp2.WSGIApplication([
    ('/',debug=True)

谢谢 :)

解决方法

您的上次评论提到3个联系人:

> application-1响应GET请求POST到
应用-2-
> application-2响应POST请求POST
申请-3
> application-3响应POST请求
显示对屏幕的响应

如果您必须在服务器端完成所有工作和消息传递,我建议使用来自application-1的App Engine的URL Fetch服务向application-2发出POST请求,然后向application-3发出POST请求.这是因为根据most browsers implement redirection的方式,您无法使用服务器启动的POST请求从application-2可靠地重定向到application-3.

服务器端示例

# Application 1
import webapp2
import urllib
from google.appengine.api import urlfetch

url_app_2 = 'http://application-2.com/'
url_app_3 = 'http://application-3.com/'

class MainPage(webapp2.RequestHandler):
  def get(self):
    data_to_post = {
      'message': 'Important data to pass on'
    }
    encoded_data = urllib.urlencode(data_to_post)
    # Send encoded data to application-2
    result = urlfetch.fetch(url_app_2,encoded_data,method='POST')

    data_to_post = {
      'message': result.content
    }
    encoded_data = urllib.urlencode(data_to_post)
    # Send encoded application-2 response to application-3
    result = urlfetch.fetch(url_app_3,method='POST')

    # Output response of application-3 to screen
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.write(result.content)

app = webapp2.WSGIApplication([
  ('/',MainPage),debug=True)


# Application 2
import webapp2

response_template = 'The message sent was:n{0}'

class MainPage(webapp2.RequestHandler):
  def post(self):
    message = self.request.get('message')
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.write(response_template.format(message))

app = webapp2.WSGIApplication([
  ('/',debug=True)


# Application 3
import webapp2

class MainPage(webapp2.RequestHandler):
  def post(self):
    message = self.request.get('message')
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.write(message)

app = webapp2.WSGIApplication([
  ('/',debug=True)

这样做的主要缺点是,在两个连续的POST请求都返回之前,初始GET请求不会收到响应.这可能会导致高响应时间.

客户端示例

该版本可以使用XMLHttpRequest从客户端完成.这里的优点是客户端从初始GET请求获得立即响应,而后续POST请求在客户端的浏览器中处理. application-2和application-3应该以相同的方式提供响应.只有application-1更改,并且只需要像this example那样向客户端提供以下HTML和Javascript.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读