用Python调用REST服务
我有一个REST服务想要调用。它需要类似下面这样的语法:
http://someServerName:8080/projectName/service/serviceName/
param1Name/param1/param2Name/param2
我必须使用POST方式连接到它。我在网上查了一些资料(比如这里和这里)... 但我遇到了问题:
如果我尝试使用HTTP的GET请求方法,自己构建路径,像这样:
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错误,并且信息是请求的资源()不可用。
当我调试这个时,发现它似乎把参数构建成了一个查询字符串("param1=whatever¶m2=whatever"...)
我该如何使用POST,并且按照预期用斜杠分隔参数呢?我哪里做错了?
3 个回答
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
这种格式。
2
- 使用
urllib2
你需要动动脑筋,可以试试这样的方式:
params = { "param1" : param1, "param2" : param2 }
urllib2.urlopen(BASE_PATH + "?" + urllib.urlencode(params), " ")
这样可能就能成功了。
5
我知道这样有点不太公平,但事情就是这样发展的……负责这个REST服务的程序员把它改成了使用&key=value
这种写法。