【问题标题】:Parse JSON error returned from Cloud Endpoints (google app engine)解析从 Cloud Endpoints 返回的 JSON 错误(谷歌应用引擎)
【发布时间】:2016-01-10 02:13:15
【问题描述】:

在我的 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代码?无论如何,我什至无法正确导入导入以使其工作,但也许它提供了一个线索。

感谢您的帮助!

【问题讨论】:

  • 您可以为 json 错误字符串制作自己的解析器。删除第一行,一切顺利。
  • @Dexter 是的,这就是我下一步要做的,但我想先问一下 SO,因为这样做似乎太愚蠢了... =(

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多