2008-12-08 24 views
8

我想在POST调用中的列表中发送一些字符串。例如:如何在帖子查询中传递一个python列表?

www.example.com/?post_data = A list of strings 

python代码接收数据作为单个字符串(而不是字符串列表)。如何将其作为字符串列表发布?

+0

以任何方式分隔字符串? – mepcotterell 2008-12-08 12:33:40

+0

是的,他们是逗号分隔的。 (如通常的Python列表) – 2008-12-08 12:37:11

+0

你想知道如何定义服务器(www.example.com)?还是你正在为一些已经存在的服务器编写客户端?如果您正在编写客户端,那么服务器API文档会说什么? – 2008-12-08 12:37:38

回答

8

在URL中没有这样的东西作为一个“字符串列表”(或者实际上是HTTP中的任何东西 - 如果您为同一个标头指定多个值,它们会在大多数Web应用程序框架中作为单个分隔值出现IME )。这只是一个单一的字符串。我建议你以某种方式(例如逗号分隔)分隔字符串,然后在另一端再次解析它们。

2

如果您收到的大字符串只是分隔,那么您可以尝试分割它。请参阅Splitting strings

为了澄清,你得到的字符串分隔的列表,拆分列表为Python列表,瞧!你有一个Python列表...

+0

如果字符串包含逗号,该怎么办?使用JSON或序列号将是最好恕我直言 – kender 2008-12-08 14:37:11

2

你在说什么吗?

post_data= ",".join(list_of_strings) 
5

TRY JSON(JavaScript Object Notation)它在python包中可用。 在此处查找:http://docs.python.org/library/json.html

您可以将列表编码为以JSON表示的数组,并附加到post参数。后来解码回列表...

2

它取决于您的服务器来格式化传入的参数。例如,当zope得到这样的请求时: http://www.zope.org?ids:list=1&ids:list=2

你可以得到这个ID作为列表。但是这个功能取决于服务器。如果你的服务器不支持某种解析并验证你的输入,你必须自己实现它。或者你使用zope。

1

数据传递到POST语句是编码为键 - 值对,使用应用程序/ X WWW的窗体-urlencoded编码(据我理解)。

所以,我会认为你代表了你的字符串列表如下所示dictionnary:

>>> my_string_list= { 's1': 'I',             
...  's2': 'love',               
...  's3': 'python'               
... }     

然后,将它作为参数传递给POST是阅读的urllib的文档一样困难。

>>> import urllib 
>>> print urllib.urlopen('http://www.google.fr/search', 
     urllib.urlencode(my_string_list) 
    ).read() 

请注意,谷歌不会使用POST的搜索查询,但你会看到谷歌报告的错误。

如果运行是Wireshark,同时输入上述代码中,你将看到POST的数据被传递为:

s3=python&s2=love&s1=I 
0

django.utils.datastructures.MultiValueDict的数据结构是表示这样的数据的清洁方式。 AFAIK它保留了订单。

>>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']}) 
>>> d['name'] 
'Simon' 
>>> d.getlist('name') 
['Adrian', 'Simon'] 
>>> d.get('lastname', 'nonexistent') 
'nonexistent' 
>>> d.setlist('lastname', ['Holovaty', 'Willison']) 

Django是使用django.http.QueryDict(的MultiValueDict子类)把一个查询字符串到蟒原语和背部。

from django.http import QueryDict 

qs = 'post_data=a&post_data=b&post_data=c' 

query_dict = QueryDict(qs) 

assert query_dict['post_data'] == 'c' 
assert query_dict.getlist('post_data') == ['a', 'b', 'c'] 
assert query_dict.urlencode() == qs 

您应该能够复制这些类并在项目中使用它们。 (虽然我没有检查所有的依赖关系)

2

如果你不能或不想用逗号简单地分隔它们,而你想用更多的列表方式发送它们。 我有我想通过数字列表,我使用PHP Web服务的另一端,我不想重建我的web服务,因为我心中已经使用了Zend框架提供了一个共同的多选元素。

此示例工作正常,我和我的小整数,它会与你的琴弦,我actualy不执行urllib.quote(S),我只是做了STR(S)。

进口的urllib

import urllib 

你刺的名单:

string_list = ['A', 'list', 'of', 'strings', 'and', 'öthér', '.&st,u?ff,'] 

连接在一起字符串列表与 'post_data [] =',也进行urlencode串

post_data = '&'.join('post_data[]='+urllib.quote(s) for s in string_list) 

帖子以http://example.com/

urllib.urlopen('http://example.com/',post_data) 
相关问题