繁体   English   中英

使用 GET 请求发送数组

[英]Send array with GET Request

我正在从 Javascript 到 Python 发送获取请求。我正在尝试传递一个二维数组,例如

[["one", "two"],["foo", "bar"]]

这是我目前正在尝试的方法,但没有用。

所以在我的 javascript 中有一个类似于上面的数组,然后像这样传递它

var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", "http://192.67.64.41/cgi-bin/hi.py?array=" + myArray, false );
xmlHttp.send( null );

然后在 python 中我是这样得到的

import cgi
form = cgi.FieldStorage()
array = form.getvalue("array")

但结果不对,在 python 中,如果我要这样做

print array[0]
#I get -> "o"
print array[1]
#I get -> "n"
print array[2]
#I get -> "e"

等等,但如果我想要的是

print array[0]
#output -> ["one", "two"]

我怎样才能做到这一点?

谢谢

您不能简单地将数组作为查询参数传递。 您将需要迭代数组并添加它,以便URL字符串,如?array[]=one&array[]=two

这是一个基本的jsfiddle作为例子

var a=['one', 'two'];
var url = 'www.google.com';

for (var i=0; i<a.length; ++i) {
    if (url.indexOf('?') === -1) {
        url = url + '?array[]=' + a[i];  
    }else {
        url = url + '&array[]=' + a[i];
    }
}

console.log(url);

不,你不必。 而且,是的,你可以做到这一点! 您可以将它作为一个字符串传递给您,然后获取它并在Python中进行评估。

您可以使用:

evaldict = {}
array = eval("[[1, 2, 3], [4, 5, 6]]", evaldict)

虽然我强迫将评估范围封装在一个字典中,但这不是安全的!

因为有人可以传递一些其他Python表达式来进行评估。 因此,最好使用ast模块中的literal_eval(),它不会计算表达式。

我建议您使用jquery及其post()方法来执行此操作,使用POST HTTP方法而不是GET。

此外,使用json可以很好地安全地完成(发送json而不是手动对JS数组进行字符串化。并使用它来避免直接评估列表(在Python中)。

这是使用jquery的客户端:

<html><head><title>TEST</title>
<script type="text/javascript" src="jquery.js"></script>
<script>

pyurl = "http://example.com/cgi-bin/so.py";
function callpy (argdict) {
    $.post(pyurl, argdict, function (data) {    
    // Here comes whatever you'll do with the Python's output.
    // For example:
    document.getElementById("blah").innerHTML = data;
    }, "text");
};

var myArray = [["one", "two"], ["foo", "bar"]];
// This is array shape dependent:
function stringify (a) {
    return "['" + a.join("', '") + "']";
    };
myArrayStr = "[";
for (x = 0; x<myArray.length; x++) {
    myArrayStr += stringify(myArray[x]) +", ";
    }
myArrayStr += "]";
// This would be better, but it is library dependent:
//myArrayStr = JSON.stringify(myArray);
</script>
</head><body>
<a href="#" onclick="javascript:callpy({'array': myArrayStr});">Click me!</a>
<p id="blah">
Something will appear here!
</p>
</body></html>

这是服务器端CGI:

#! /usr/bin/env python
try:
    # This version of eval() ensures only datatypes are evaluated
    # and no expressions. Safe version of eval() although slower. It is available in Python 2.6 and later
    from ast import literal_eval as eval
except ImportError:
    import sys
    print "Content-Type: text/html\n"
    print "<h1>literal_eval() not available!</h1>"
    sys.exit()
import cgi, cgitb
import sys
cgitb.enable()

print "Content-Type: text/html\n"

i = cgi.FieldStorage()
q = i["array"].value.strip()
print "I received:<br>"
print q
# Put here something to eliminate eventual malicious code from q
# Check whether we received a list:
if not q.startswith("[") and not q.endswith("]"):
    print "Wrong query!"
    sys.exit()

try: myArray = eval(q)
except: print "Wrong query!"; sys.exit()
if not isinstance(myArray, list):
    print "Wrong query!"
    sys.exit()
print "<br>Evaluated as:<br>"
print myArray

现在,请注意,在两侧使用json会更快,更灵活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM