0

使用json-rpc-cpp库,我正在使用钱包 RPC创建一个 EOS 钱包。

HttpClient *temp = new HttpClient("http://127.0.0.1:30031/v1/wallet/create"); 

string res;
string str = "testwallet1";
temp->SendRPCMessage(str, res);
cout<<"res : "<<res<<endl;

它正在成功创建钱包,但之后我收到以下异常。

unknown file: Failure
C++ exception with description "Exception -32603 : INTERNAL_ERROR: : "PW5JcEu7jTXd7XUYLWkPuCUbr1pqBhusqRFfhSVToqUNcDuZ3oeYK"" thrown in the test body.

我发现HttpClient收到 201 响应代码。我不知道如何避免这种异常。有谁有想法吗?

4

2 回答 2

1

201基本上意味着您的请求已成功处理。正如此消息来源所解释的:

201 CREATED 请求已完成并导致创建一个或多个新资源。

请求创建的主要资源由响应中的 Location 头字段标识,如果没有收到 Location 字段,则由有效的请求 URI 标识。

201 响应负载通常描述并链接到创建的资源。请参阅 RFC7231 的第 7.2 节,以讨论 201 响应中验证器头字段(例如 ETag 和 Last-Modified)的含义和用途。

当对响应数据进行任何进一步处理时,必须抛出异常。
如果没有更多信息,我无法说出究竟是什么原因造成的。

于 2019-08-14T09:47:57.993 回答
1

该问题是由HttpClient::SendRPCMessage()实现中的错误引起的。

在内部,HttpClient使用 libcurl 进行 HTTP 处理,并且在SendRPCMessage()实现的最后是以下检查是否curl_easy_perform()成功:

long http_code = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);

if (http_code != 200) {
  throw JsonRpcException(Errors::ERROR_RPC_INTERNAL_ERROR, result);
}

如您所见,除了 200 之外的任何SendRPCMessage()HTTP 响应代码都会引发异常。但是根据 HTTP 标准所有2xx 响应代码都表示成功,而不仅仅是 200。在这种情况下,响应代码 201表示:

10.2.2 201 创建

请求已完成并导致创建新资源。新创建的资源可以被响应实体中返回的 URI 引用,资源的最具体的 URI 由 Location 头字段给出。响应应该包含一个实体,其中包含资源特征和位置列表,用户或用户代理可以从中选择最合适的一个。实体格式由 Content-Type 标头字段中给出的媒体类型指定。源服务器必须在返回 201 状态码之前创建资源。如果无法立即执行该操作,则服务器应该使用 202(已接受)响应来响应。

一个 201 响应可能包含一个 ETag 响应头字段,指示刚刚创建的请求变体的实体标签的当前值,请参阅第 14.19 节

这显然是执行中的逻辑错误SendRPCMessage()。的检查http_code应该更像这样:

if ((http_code / 100) != 2)

这会将所有 2xx 响应代码视为成功。

我已经向 json-rpc-cpp 的作者提交了一份错误报告:

#278 HttpClient::SendRPCMessage() 为成功的 HTTP 响应抛出 ERROR_RPC_INTERNAL

于 2019-08-14T19:04:53.767 回答