通过 iis 上的 python 脚本处理带有 json 的 http post 请求
Posted
技术标签:
【中文标题】通过 iis 上的 python 脚本处理带有 json 的 http post 请求【英文标题】:handle http post request with json by python script on iis 【发布时间】:2016-08-31 11:26:50 【问题描述】:我在处理使用 JSON 作为请求正文的 http post 请求时遇到问题。 我正在使用 python 作为服务器脚本运行 IIS。
这是发出请求的代码:
var http = new XMLHttpRequest();
var url = "http://myurl.ext/py/script.py";
http.onreadystatechange = function()
if(http.readyState == 4 && http.status == 200)
console.log(http.responseText);
data = "field":"value", "number":5
http.open('POST', url, true);
http.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
http.send(JSON.stringify(data));
在服务器端我有:
import cgi
import http.client
print("Content-Type: text/text")
print("")
print(cgi.parse())
print(http.client.HTTPResponse)
cgi.parse() 给出空字符串
http.client.HTTPResponse 给出空字符串
cgi.FieldStorage() 给出空字符串,但如果我提交表单,它会返回输入字段的值。
我想在后台向脚本发送 JSON 数据,并将一些处理后的值也作为 JSON 返回。
【问题讨论】:
【参考方案1】:cgi
模块的设计主要考虑来自 POST 请求的表单处理,或来自 GET 请求的查询字符串解析。因此,它并没有真正提供太多可能帮助您处理 JSON 请求的内容。
请记住,CGI 脚本所做的只是从进程的环境及其标准输入中读取数据。因此,您可以从sys.stdin
读取 POST 的正文:
#!/usr/bin/env python3
import sys
import json
from pprint import pprint
print('Content-Type: text/plain')
print()
try:
data = json.load(sys.stdin)
print("Received:")
pprint(data)
except json.JSONDecodeError as exc:
print('Failed to decode JSON request: '.format(exc))
这个脚本所做的只是将标准输入解码为 JSON 并在响应中漂亮地打印出来。
你最好看看更有用的东西,比如flask
、bottle
等。
【讨论】:
谢谢。进一步发展:我尝试了代码,它使 IIS 在执行脚本时冻结。一些研究表明 sys.stdin 等待某种 EOF。 @MaxLopatin:好的,查看内容长度标头并将stdin
中的那么多字节读入字符串。使用json.loads()
解码该字符串。【参考方案2】:
要使其正常工作,您必须明确说明要阅读的内容。
data = "";
if int(os.environ.get('CONTENT_LENGTH', 0)) != 0:
for i in range(int(os.environ.get('CONTENT_LENGTH', 0))):
data += sys.stdin.read(1)
print(data)
这对我有用
【讨论】:
一次读取一个字符效率低下。为什么不干脆做data = sys.stdin.read(int(os.environ.get('CONTENT_LENGTH', 0)))
?
是的。这就是我最终的结果。以上是关于通过 iis 上的 python 脚本处理带有 json 的 http post 请求的主要内容,如果未能解决你的问题,请参考以下文章
将传入的电子邮件通过管道传输到 Windows IIS SMTP 上的脚本?