解析从Cloud Endpoints(谷歌应用引擎)返回的JSON错误

时间:2016-01-10 02:13:15

标签: android google-app-engine google-cloud-endpoints

在我的端点API方法中,我有一行代码,如果用户已经使用了电子邮件地址,则会抛出错误:

throw new BadRequestException("The Email address is already taken.");

在我的Android客户端中,我试图解析此错误,以便将其显示给用户:

  try {
            myApi.registerUser(registrationInput).execute();
        } catch (IOException e) {
            String jsonError = e.getMessage();
            try {
                JSONObject  jsonRootObject = new JSONObject(jsonError);
                // myError should be "The Email address is already taken."
                String myError = jsonRootObject.optString("message").toString();

            }catch(Exception ex)
            {
                ex.printStackTrace(); 
            }
}

但是我在Android Studio中收到错误:

  

org.json.JSONException:java.lang.Integer类型的值400不能   转换为JSONObject

jsonError字符串的值是:

400 Bad Request
{
  "code": 400,
  "errors": [
    {
      "domain": "global",
      "message": "The Email address is already taken.",
      "reason": "badRequest"
    }
  ],
  "message": "The Email address is already taken."
}

正如您所看到的,我正在尝试获取错误的message

我认为问题是返回的错误以400 Bad Request开头,而不是开放式括号。

问题:是否有正确的方法来解析Cloud Endpoints错误以获取代码和消息,以便我可以将其显示给我的用户?

我在文档中看到了一些Java代码here,如下所示:

try {
  commitResponse = datastore.commit(commitRequest);
} catch (DatastoreException e) {
  int code = e.getCode();
  String method = e.getMethodName();
  JSONObject json = new JSONObject(new JSONTokener(e.getMessage()));
  JSONObject error = json.getJSONObject("error")
      .getJSONArray("errors")
      .getJSONObject(0);
  String reason = error.getString("reason");
  String message = error.getString("message");
  // ... process error ...
}

但我认为这不适用于Android。我认为这是非Android的Java代码?无论如何,我无法获得进口权,甚至可以使其有效,但也许它提供了线索。

感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

端点抛出的异常包含收到的HTTP响应消息。因此,收到的回复基本上是由HTTP Response Resource定义的标准RFC 1945,其中第一行是响应的Status-Line,其余是可选的message-body

虽然快速访问JSON邮件正文有点麻烦,但这似乎是一种相对简单的方法,可以让开发人员访问完整的HTTP响应,如果需要的话。

正如@Dexter之前所建议的那样,从getMessage()的结果中删除第一行应该足以严格返回JSON消息体。如果您稍后遇到导致此解析解决方案出现问题的其他标头,您可以搜索HTTP标头的末尾,然后从那里解析,直到JSON消息正文的String结束。