用Python调用REST服务

3 投票
3 回答
11451 浏览
提问于 2025-04-16 03:21

我有一个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&param2=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
  1. 使用 urllib2
  2. 你需要动动脑筋,可以试试这样的方式:

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

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

    这样可能就能成功了。

5

我知道这样有点不太公平,但事情就是这样发展的……负责这个REST服务的程序员把它改成了使用&key=value这种写法。

撰写回答