【发布时间】: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