如何在帖子查询中传递python列表?

时间:2008-12-08 12:28:28

标签: python web-services

我想在POST调用中的列表中发送一些字符串。例如:

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

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

8 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

你在说这个吗?

post_data= ",".join( list_of_strings )

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

如果您不能或不想简单地用逗号分隔它们,并且您希望以更多列表方式发送它们。 我有一个我希望传递的数字列表,我在另一端使用PHP Web服务,我不想重建我的webservice,因为我使用了Zend Framework提供的常见多选元素。

这个例子适用于我和我的小整数,它会用你的字符串,我实际上不执行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)

答案 6 :(得分:1)

传递给POST语句的数据(据我所知)使用application / x-www-form-urlencoded编码编码为键值对。

所以,我假设您将字符串列表表示为以下词典:

>>> 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()

请注意,Google不会对其搜索查询使用POST,但您会看到Google报告的错误。

如果在键入上面的代码时运行WireShark,您将看到POST的数据传递为:

 s3=python&s2=love&s1=I

答案 7 :(得分: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.QueryDictMultiValueDict的子类)将查询字符串转换为python原语并返回。

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

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