通过 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 并在响应中漂亮地打印出来。

你最好看看更有用的东西,比如flaskbottle等。

【讨论】:

谢谢。进一步发展:我尝试了代码,它使 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 上的脚本?

从 Jupyter Notebook 运行带有可变解析器参数的 python 脚本

带有 IIS 的 Amazon 弹性负载均衡器

通过Ansible运行带有模块的python脚本

如何通过代码安装 IIS 8

未收到 WinHttp POST 正文