Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用GET请求发送数组_Javascript_Python_Arrays_Http_Get - Fatal编程技术网

Javascript 使用GET请求发送数组

Javascript 使用GET请求发送数组,javascript,python,arrays,http,get,Javascript,Python,Arrays,Http,Get,我正在从Javascript向Python发出get请求。我试图传递一个2D数组,比如 [["one", "two"],["foo", "bar"]] 这是我目前正在尝试的,但它不起作用 因此,在我的javascript中,我有一个类似于上面的数组,然后像这样传递它 var xmlHttp = new XMLHttpRequest(); xmlHttp.open( "GET", "http://192.67.64.41/cgi-bin/hi.py?array=" + myArray, fals

我正在从Javascript向Python发出get请求。我试图传递一个2D数组,比如

[["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 );
import cgi
form = cgi.FieldStorage()
array = form.getvalue("array")
然后在python中,我得到了如下结果

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

这里有一个基本的例子

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);
var a=['one','two'];
var url='www.google.com';

对于(var i=0;iNo),您不必这样做。而且,是的,您可以这样做!您可以像以前一样将其作为一个字符串传递,然后获取它并在Python中对其求值

您可以使用:

evaldict = {}
array = eval("[[1, 2, 3], [4, 5, 6]]", evaldict)
虽然我强制将评估范围封装在dict中,但这并不安全

因为有人可以传递其他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>
测试
pyurl=”http://example.com/cgi-bin/so.py";
函数callpy(argdict){
$.post(pyurl,argdict,函数(数据){
//下面是您将对Python输出执行的任何操作。
//例如:
document.getElementById(“blah”).innerHTML=数据;
}“文本”);
};
var myArray=[“一”、“二”]、[“foo”、“bar”];
//这取决于阵列形状:
函数字符串化(a){
返回“[”+a.join(“,”)+“]””;
};
myArrayStr=“[”;

对于(x=0;xso),我必须分别传递每个字符串?也像
?array[]=one&array[]=two&array[]=foo&array[]=bar
?但是在python中,它将位于数组中?您将能够通过它们的键访问GET值,因此
数组[0]
将等于
一个
好的,只是为了澄清
数组[2]
会是foo吗?有没有办法让它成为2D数组?只需构建查询字符串即可,这样查询字符串将读取
array[][]]=bar
,返回为
array[0][0]
@carl markham:你还记得查询字符串不是无限的吗?你的建议会奏效,但是,嗯,我宁愿直接解决这个问题,而不是回避数组。你能改变用python接收数据的方式吗?最好改变你从body读取数据的请求。@MarkoGrešak是的,我可以改变它,我只是不确定改成什么?但是如果你能告诉我一个更好的方法将数据从javascript发送到Python,那将是一个好的开始,你可以发送一个POST请求,并将数据作为javascript请求体。如果你使用一个库,比如XMLHttpRequests是一件轻而易举的事,
$.ajax
。对于后端fr来说,这将更加容易amework,从python网页上的列表中选择一个。为了在任何严肃的工作中提高工作效率,您都需要它们。@MarkoGrešak是的,但我仍然知道如何传递2D数组?您可能必须使用
json将其转换为json。在发送之前将其字符串化,然后在python代码中重新解析。但我相信jQuery的
$.ajax({url:'http://192.67.64.41/cgi-bin/hi.py,数据:myArray})
将自动完成此操作。您介意提供更多信息吗?因为我不确定如何执行您所描述的内容。是的,但请给我一些时间。我只是想让您知道这是可能的,而且更重要的是,非常简单。我以前做过。我会很快编辑我的帖子。太好了,只要您有时间,我就好:)顺便说一句,我不担心安全性,因为这只是一个临时情况,但是如果一篇文章仍然比它所有的好,那么肯定会更好,不包括安全性。因为你不必担心转义字符等,你只需要发送一个原始二进制数据,它可以是你想要的大小(好吧,大到Web服务器允许的大小).好的,那就发布吧,更新答案时请告诉我