1、前言

  今天需要实现一个Pyhton的http服务,与Web的JS进行交换。

2、实例代码

  支持HEAD、GET、POST方法,将参数转换为JSON格式,返回结果以JSON字符串返回。

  1. import time
  2. import BaseHTTPServer
  3. import urllib
  4. import json
  5. import base64
  6.  
  7. HOST_NAME = '127.0.0.1'
  8. PORT_NUMBER = 8080
  9. CONIFRM_PATH = '/tmp'
  10.  
  11. class HttpHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  12. def _set_headers(self):
  13. self.send_response(200)
  14. self.send_header('Content-type', 'text/html')
  15. self.end_headers()
  16.  
  17. def _json_encode(self, data):
  18. array = data.split('&')
  19. json_data = {}
  20. for item in array:
  21. item = item.split('=', 1)
  22. json_data[item[0]] = item[1]
  23. return json_data
  24.  
  25. def _get_handler(self, data):
  26. json_data = self._json_encode(data)
  27.  
  28. def _post_handler(self, data):
  29. retVal = {}
  30. json_data = self._json_encode(data)
  31. file_name = json_data['FileName']
  32. file_data = base64.b64decode(json_data['FileData'])
  33. file_path = "%s/%s"% (CONIFRM_PATH, file_name)
  34. fd = open(file_path, 'w')
  35. fd.write(file_data)
  36. fd.close()
  37. retVal["RetCode"] = 0
  38. return json.dumps(retVal)
  39.  
  40. def do_HEAD(self):
  41. self._set_headers()
  42.  
  43. def do_GET(self):
  44. self._set_headers()
  45. #get request params
  46. path = self.path
  47. query = urllib.splitquery(path)
  48. self._get_handler(query[1]);
  49.  
  50. def do_POST(self):
  51. self._set_headers()
  52. #get post data
  53. post_data = self.rfile.read(int(self.headers['content-length']))
  54. post_data = urllib.unquote(post_data).decode("utf-8", 'ignore')
  55. retStr = self._post_handler(post_data)
  56. self.wfile.write(retStr)
  57.  
  58. if __name__ == '__main__':
  59. server_class = BaseHTTPServer.HTTPServer
  60. httpd = server_class((HOST_NAME, PORT_NUMBER), HttpHandler)
  61. print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
  62. try:
  63. httpd.serve_forever()
  64. except KeyboardInterrupt:
  65. pass
  66. httpd.server_close()
  67. print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)

使用NodeJS默认测试如下:

  1. var request = require('request');
  2. // Set the headers
  3. var headers = {
  4. 'User-Agent': 'USSL Agent/0.0.1',
  5. 'Content-Type': 'application/x-www-form-urlencoded'
  6. }
  7.  
  8. // Configure the request
  9. var options = {
  10. url: 'http://127.0.0.1:8080/',
  11. method: 'GET',
  12. headers: headers,
  13. qs: {'Method':'Put','FileName': 'test.doc'}
  14. }
  15.  
  16. // Start the request
  17. request(options, function (error, response, body) {
  18. if (!error && response.statusCode == 200) {
  19. console.log(body)
  20. }
  21. })
  22.  
  23. var options = {
  24. url: 'http://127.0.0.1:8080/',
  25. method: 'POST',
  26. headers: headers,
  27. form: {'FileName': 'test-confirm.txt', 'FileData': "dGhpcyBpcyBhIGV4YW1wbGU="}
  28. }
  29.  
  30. request(options, function (error, response, body) {
  31. if (!error && response.statusCode == 200) {
  32. console.log(body)
  33. }
  34. })

Python的HTTP服务实例的更多相关文章

  1. redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐

    redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐 1.Redis 官方网站下载: http://redis.io/dow ...

  2. Python回调函数用法实例

    Python回调函数用法实例 作者:no.body链接:https://www.zhihu.com/question/19801131/answer/27459821 什么是回调函数? 我们绕点远路来 ...

  3. 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍  <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制 一.综述 SuperIO(SIO)定位 ...

  4. 《连载 | 物联网框架ServerSuperIO教程》- 14.配制工具介绍,以及设备驱动、视图驱动、服务实例的挂载

    注:ServerSuperIO二次开发套件授权码申请---截止到:2016-12-09 1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架Server ...

  5. [WCF编程]8.服务实例的生命周期

    一.服务实例的生命周期概览 我们已经直到,通过显式调用Close方法或等待默认的超时时间到来,都可以释放服务实例.但是,在会话连接里,经常需要按一定顺序调用方法. 二.分步操作 会话契约的操作有时隐含 ...

  6. Python 监控nginx服务是否正常

    Python 监控nginx服务是否正常 #!/usr/bin/env python import os, sys, time from time import strftime while True ...

  7. Windows Azure虚拟机和云服务实例计费方式更新

    在之前的Windows Azure计费账单中,A0,A1,A2,A3,A4系列的虚拟机(云服务实例)都是以A1为基准计费单位的,即: 虚拟机大小 计费单位(小时) A0 A1*0.25 A1 A1*1 ...

  8. python基础——类和实例

    python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...

  9. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

随机推荐

  1. 从.git文件夹探析git实现原理

    git是一款分布式代码版本管理工具,通过git能够更加高效地协同编程.了解git的工作原理将有助于我们使用git工具更好地管理项目.通过了解.git文件夹中的文件组成,我们可以从一个角度去窥探git的 ...

  2. .net中ThreadPool与Task的认识总结

    线程池和Task是多线程编程中两个经常使用的技术,大家在熟悉不过了.他们有什么关联关系?Task又是怎么工作的呢?估计很多时候会犯糊涂.通过翻阅资料,终于弄明白了,与大家分享一下.   工作线程与I/ ...

  3. CCF-201512-2-消除类游戏

    问题描述 试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游 ...

  4. php加密字符串超时不可解密

    <?php/** * 加密字符串在指定时间内解密有效 * @param  [type]  $string    明文字符串 * @param  string  $operation 解密值为DE ...

  5. phpcms网站搬家 至 服务器 完整并且详细过程

    上传服务器空间后,才会通过搜索域名进行网页访问. 上传的过程肯定会有很多东西要修改,例如数据库怎么上传.路径怎么修改等..... 这就让大家看下,自己不断尝试后的完整搬家步骤!!! 一.上传服务器 ( ...

  6. Vue 事件

    一.事件冒泡 方法一.使用event.cancelBubble = true来阻止冒泡 <div @click="show2()"> <input type=&q ...

  7. 自动类型安全的.NET标准REST库refit

    在SCOTT HANSELMAN 博客上看到一个好东西<Exploring refit, an automatic type-safe REST library for .NET Standar ...

  8. 简陋的斗地主,js实现

    最近闲了两天没事做,用js写了个斗地主,练习练习.代码和功能都很简陋,还有bug,咋只是聊聊自己的思路. 这里说说斗地主主要包含的功能:洗牌,发牌,玩家出牌.电脑出牌,出牌规则的验证,输赢啥的没有判断 ...

  9. underscore源码解析(一)

    留存root // Establish the root object, `window` (`self`) in the browser, `global` // on the server, or ...

  10. 基于 HTML5 Canvas 的 3D 压力器反序列化

    在实际应用中,我觉得能够通过操作 JSON 文件来操作 3D 上的场景变化是非常方便的一件事,尤其是在做编辑器进行拖拽图元并且在图元上产生的一系列变化的时候,都能将数据很直观地反应给我们,这边我们简单 ...