代码为401时如何在okhttp中获取响应正文
how to get response body in okhttp when code is 401
我正在使用 okHttp 3.2.0,这里是构建请求对象的代码
MediaType JSON = MediaType.parse(AppConstants.CONTENT_TYPE_VALUE_JSON);
RequestBody body = RequestBody.create(JSON, requestBody);
HttpUrl url = new HttpUrl.Builder()
.scheme("http")
.host("192.168.0.104")
.port(8080)
.addPathSegment("mutterfly-server")
.addPathSegment("j_spring_security_check")
.addQueryParameter("j_username", jsonObject.getString("emailId"))
.addQueryParameter("j_password", jsonObject.getString("password"))
.build();
request = new Request.Builder()
.addHeader(AppConstants.CONTENT_TYPE_LABEL, AppConstants.CONTENT_TYPE_VALUE_JSON)
.addHeader(AppConstants.ACCEPT_LABEL, AppConstants.CONTENT_TYPE_VALUE_JSON)
.url(url)
.post(body)
.build();
这是我解析响应的方式
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
String respBody;
if (response.isSuccessful()) {
if (response.body() != null) {
respBody = response.body().string();
Log.i(TAG, respBody);
response.body().close();
if (AppMethods.checkIfNull(loginParserListener)) {
try {
final VUser user = AppMethods.getGsonInstance().fromJson(respBody, VUser.class);
} catch (Exception e) {
}
}
}
} else {
switch (response.code()){
case 401:
String body="HTTP_UNAUTHORIZED";
break;
}
}
}
});
这是身份验证失败时的理想响应(来自 Web rest 客户端)。
{"msgDesc":"The username or password you entered is incorrect..","statusCode":401}
编辑:
response.toString()
returns
Response{protocol=http/1.1, code=401, message=Unauthorized, url=http://192.168.0.104:8080/mutterfly-server/j_spring_security_check?j_username=s@s.s&j_password=1}
response.body().toString()
returns
okhttp3.internal.http.RealResponseBody@528ae030
我想获取响应正文中的 'msgDesc'。有没有什么方法可以 return 这个字符串?
401
表示 permission denied
。
检查您的 token
是否有效或 user
/password
是否正确。
试试这个:
switch (response.code()){
case 401:
JsonObject object=new JsonObject(response.body().string());
String body=object.getString("msgDesc");
break;
}
这很奇怪,但是 OkHttp 背后的公司 Square 选择不使用 'toString()' 而是 'string()' 作为将主体作为字符串获取的方法。
所以这行得通;
String string = response.body().string();
//convert to JSON and get your value
但事实并非如此:
String string = response.body().toString();
我正在使用 okHttp 3.2.0,这里是构建请求对象的代码
MediaType JSON = MediaType.parse(AppConstants.CONTENT_TYPE_VALUE_JSON);
RequestBody body = RequestBody.create(JSON, requestBody);
HttpUrl url = new HttpUrl.Builder()
.scheme("http")
.host("192.168.0.104")
.port(8080)
.addPathSegment("mutterfly-server")
.addPathSegment("j_spring_security_check")
.addQueryParameter("j_username", jsonObject.getString("emailId"))
.addQueryParameter("j_password", jsonObject.getString("password"))
.build();
request = new Request.Builder()
.addHeader(AppConstants.CONTENT_TYPE_LABEL, AppConstants.CONTENT_TYPE_VALUE_JSON)
.addHeader(AppConstants.ACCEPT_LABEL, AppConstants.CONTENT_TYPE_VALUE_JSON)
.url(url)
.post(body)
.build();
这是我解析响应的方式
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
String respBody;
if (response.isSuccessful()) {
if (response.body() != null) {
respBody = response.body().string();
Log.i(TAG, respBody);
response.body().close();
if (AppMethods.checkIfNull(loginParserListener)) {
try {
final VUser user = AppMethods.getGsonInstance().fromJson(respBody, VUser.class);
} catch (Exception e) {
}
}
}
} else {
switch (response.code()){
case 401:
String body="HTTP_UNAUTHORIZED";
break;
}
}
}
});
这是身份验证失败时的理想响应(来自 Web rest 客户端)。
{"msgDesc":"The username or password you entered is incorrect..","statusCode":401}
编辑:
response.toString()
returns
Response{protocol=http/1.1, code=401, message=Unauthorized, url=http://192.168.0.104:8080/mutterfly-server/j_spring_security_check?j_username=s@s.s&j_password=1}
response.body().toString()
returns
okhttp3.internal.http.RealResponseBody@528ae030
我想获取响应正文中的 'msgDesc'。有没有什么方法可以 return 这个字符串?
401
表示 permission denied
。
检查您的 token
是否有效或 user
/password
是否正确。
试试这个:
switch (response.code()){
case 401:
JsonObject object=new JsonObject(response.body().string());
String body=object.getString("msgDesc");
break;
}
这很奇怪,但是 OkHttp 背后的公司 Square 选择不使用 'toString()' 而是 'string()' 作为将主体作为字符串获取的方法。
所以这行得通;
String string = response.body().string();
//convert to JSON and get your value
但事实并非如此:
String string = response.body().toString();