max*_*xxo 7 android json android-volley
如何在volley中发出JSON请求,我需要在body中发送一个authentification头和JSON对象,我希望只有一个状态代码200回答
JsonObjectRequest request = new JsonObjectRequest(
method,
url,
myJsonObject,
responseListener,
errorListener) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
String creds = String.format("%s:%s", login, password);
String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
headers.put("Authorization", auth);
return headers;
}
};
new Response.Listener<String>(){
@Override
public void onResponse(String response) {
Toast.makeText(getActivity(), response, 1000).show();
}
Run Code Online (Sandbox Code Playgroud)
我尝试了使用字符串或JSON对象,对象的不同种类的响应侦听器,但始终存在错误:android volley org.json.JSONException:在字符0处输入的结尾
或者是否有任何其他类型的请求在volley中支持和json对象和authentification标头在正文和响应只是一个http状态代码?
我知道这是一个老问题,但我认为我仍然回答这个问题,因为我的答案可能会对未来的人有所帮助 -
您需要创建一个扩展Request类的自定义类,并在该类中覆盖这些方法
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
return Response.success(response.statusCode, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected void deliverResponse(Integer statusCode) {
mListener.onResponse(statusCode);
}
Run Code Online (Sandbox Code Playgroud)
这是班上的核心和灵魂.
有关完整代码和说明,请查看我的博客主题 -
从Android Volley库获取服务器响应状态200
希望它有所帮助,谢谢
感谢Varundroid和Itai Hanski.这是正确的,你只需要继承JsonObjectRequest.
为方便起见,这是我的覆盖:
public class MyJsonObjectRequest extends JsonObjectRequest {
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
// here's the new code, if jsonString.length() == 0 don't parse
if (jsonString.length() == 0) {
return Response.success(null, HttpHeaderParser.parseCacheHeaders(response));
}
// end of patch
return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我只是使用它而不是JsonObjectRequest.不太漂亮,也不太难看.
JsonObjectRequest当您期望网络响应是 JSON 对象时使用。由于您没有预料到这一点,因此您不应该使用它。
为了便于使用,Volley 附带了一些预定义的流行请求类型,但您始终可以创建自己的请求类型。我建议基于 发出自定义请求JsonObjectRequest,但使用该方法的不同实现,parseNetworkResponse()该方法不期望响应是 JSON 对象,因为您没有收到响应。您可以在那里添加您需要的任何其他更改。
| 归档时间: |
|
| 查看次数: |
5600 次 |
| 最近记录: |