Json请求错误:{"jsonrpc":"2.0","id":44,"error":{"code":-32603,"message":"没有此服务方法"}}
我正在尝试建立一个HTTPS连接,连接到这个地址:“android-review.googlesource.com”,并发送一个json请求。
这个地址:“android-review.googlesource.com”是Gerrit代码审查系统的,它使用的是REST API。你可以在这里找到关于Gerrit REST API的更多信息:https://gerrit-review.googlesource.com/Documentation/rest-api.html。
在Gerrit代码审查系统中,每个审查都与一个变更请求相关。我尝试通过json请求获取变更请求的信息。以下是我使用的URL和请求:
url = "/gerrit_ui/rpc/ChangeDetailService"
req = {"jsonrpc" : "2.0", "method": "changeDetail", "params": [{"id": id}], "id": 44 }
你可以在这里找到完整的代码:
import socket, sys
import httplib
import pyodbc
import json
import types
import datetime
import urllib2
import os
import logging
import re, time
def GetRequestOrCached( url, method, data, filename):
path = os.path.join("json", filename)
if not os.path.exists(path):
data = MakeRequest(url, method, data)
time.sleep(1)
data = data.replace(")]}'", "")
f = open(path, "w")
f.write(data)
f.close()
return open(path).read()
def MakeRequest(url, method, data, port=443):
successful = False
while not successful:
try:
conn = httplib.HTTPSConnection("android-review.googlesource.com", port)
headers = {"Accept": "application/json,application/jsonrequest",
"Content-Type": "application/json; charset=UTF-8",
"Content-Length": len(data)}
conn.request(method, url, data, headers)
conn.set_debuglevel(1)
successful = True
except socket.error as err:
# this means a socket timeout
if err.errno != 10060:
raise(err)
else:
print err.errno, str(err)
print "sleep for 1 minute before retrying"
time.sleep(60)
resp = conn.getresponse()
if resp.status != 200:
raise GerritDataException("Got status code %d for request to %s" % (resp.status, url))
return resp.read()
#-------------------------------------------------
id=51750
filename = "%d-ChangeDetails.json" % id
url = "/gerrit_ui/rpc/ChangeDetailService"
req = {"jsonrpc" : "2.0",
"method": "changeDetail",
"params": [{"id": id}],
"id": 44
}
data = GetRequestOrCached(url, "POST", json.dumps(req), filename)
print json.loads(data)
在代码中,id代表审查的编号,这个编号可以是1到51750之间的数字,但并不是所有的编号在系统中都存在,所以可以尝试不同的数字,看看最终哪个能得到响应。例如,这三个编号肯定存在:51750、51743和51742。我尝试了这些数字,但所有的请求都得到了同样的错误:
"{"jsonrpc":"2.0","id":44,"error":{"code":-32603,"message":"No such service method"}}",所以我猜代码可能有问题。
1 个回答
你为什么要用 url = "/gerrit_ui/rpc/ChangeDetailService"
呢?这个在你提供的REST文档里根本没有提到。我觉得这可能是一个旧的内部接口,现在已经不再支持了。而且我也不太明白你为什么要用 POST
这个方法。
其实,像这样就可以正常工作:
curl "https://android-review.googlesource.com/changes/?q=51750"