使用Python调用REST服务

时间:2010-08-26 20:00:55

标签: python web-services rest post

我有一个我想要调用的REST服务。它需要类似于以下语法的内容:

http://someServerName:8080/projectName/service/serviceName/
      param1Name/param1/param2Name/param2

我必须使用POST连接到它。我尝试在线阅读(例如herehere)......但这是我的问题:

如果我尝试使用HTTP get request方法,可以构建我自己的路径,如下所示:

BASE_PATH = "http://someServerName:8080/projectName/service/serviceName/"
urllib.urlopen(BASE_PATH + "param1/" + param1 + "/param2/" + param2)

它给我一个错误,说不允许GET。

如果我尝试使用HTTP post请求方法,请执行以下操作:

params = { "param1" : param1, "param2" : param2 }
urllib.urlopen(BASE_PATH, urllib.urlencode(params))

它返回404错误以及消息The requested resource () is not available.当我调试它时,它似乎将params构建成一个查询字符串(“param1 = whatever& param2 = whatever”......)

我如何使用POST但是按预期传递由斜杠分隔的参数?我做错了什么?

3 个答案:

答案 0 :(得分:5)

我知道这有点不公平,但最终会发生这种情况......负责REST服务的程序员将其更改为使用&key=value语法。

答案 1 :(得分:2)

  1. 使用urllib2
  2. 你必须要聪明;

    之类的东西

    params = { "param1" : param1, "param2" : param2 }

    urllib2.urlopen(BASE_PATH + "?" + urllib.urlencode(params), " ")

    可能会工作。

答案 2 :(得分:0)

这样的事可能有用:

param1, param2 = urllib.quote_plus(param1), urllib.quote_plus(param2)
BASE_PATH = "http://someServerName:8080/projectName/service/serviceName/"
urllib.urlopen(BASE_PATH + "param1/" + param1 + "/param2/" + param2, " ")

urlopen的第二个参数告诉它使用空数据执行POST请求。 quote_plus允许您在不强制进入&key=value方案的情况下转义特殊字符。