在我的端点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代码?无论如何,我无法获得进口权,甚至可以使其有效,但也许它提供了线索。
感谢您的帮助!!
答案 0 :(得分:1)
端点抛出的异常包含收到的HTTP响应消息。因此,收到的回复基本上是由HTTP Response Resource定义的标准RFC 1945,其中第一行是响应的Status-Line
,其余是可选的message-body
。
虽然快速访问JSON邮件正文有点麻烦,但这似乎是一种相对简单的方法,可以让开发人员访问完整的HTTP响应,如果需要的话。
正如@Dexter之前所建议的那样,从getMessage()
的结果中删除第一行应该足以严格返回JSON消息体。如果您稍后遇到导致此解析解决方案出现问题的其他标头,您可以搜索HTTP标头的末尾,然后从那里解析,直到JSON消息正文的String
结束。