Json请求错误:{"jsonrpc":"2.0","id":44,"error":{"code":-32603,"message":"没有此服务方法"}}

0 投票
1 回答
3745 浏览
提问于 2025-04-18 13:34

我正在尝试建立一个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 个回答

2

你为什么要用 url = "/gerrit_ui/rpc/ChangeDetailService" 呢?这个在你提供的REST文档里根本没有提到。我觉得这可能是一个旧的内部接口,现在已经不再支持了。而且我也不太明白你为什么要用 POST 这个方法。

其实,像这样就可以正常工作:

curl "https://android-review.googlesource.com/changes/?q=51750"

撰写回答