接收带有 json 请求的布尔变量
receiving Boolean variable with json request in volley
我正在尝试使用 android 中的 volley 通过 web-api 向 MVC 服务器发出请求,我想将函数的参数作为 JSON(请求正文),所以我使用 JSONRequest 进行调用,但问题是 JSONRequest 强制您使用 Response.Listner,而我正在调用的函数 returns 一个布尔变量,所以每次调用时我都会遇到转换错误
我尝试进行接受布尔值的自定义调用,但现在出现错误 400,我不知道为什么,有没有办法让 jsonRequest 接收布尔值?如果没有,解决方案是什么?
我第一次使用的功能:
public void getJSON(String controllerName,String actionName, JSONObject requestBody,Response.Listener<JSONObject> success,Response.ErrorListener error){
String url = makeURL(controllerName,actionName);
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,url,requestBody,success,error);
request.setTag(APP_TAG);
requestQueue.add(request);
}
这是我对自定义请求的第二次尝试(出现错误 400):
public void getBooleanRequest(String controllerName,String actionName, final HashMap<String,String> body, final HashMap<String,String> header, final Response.Listener<Boolean> success,Response.ErrorListener error){
String url = makeURL(controllerName,actionName);
Request<Boolean> request = new Request<Boolean>(Request.Method.POST,url,error) {
@Override
protected Response<Boolean> parseNetworkResponse(NetworkResponse response) {
return Response.success(true, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected void deliverResponse(Boolean response) {
success.onResponse(response);
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return body;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return header;
}
};
request.setTag(APP_TAG);
requestQueue.add(request);
}
您可以试试我下面的示例代码:
private class BooleanRequest extends Request<Boolean> {
private final Response.Listener<Boolean> mListener;
private final Response.ErrorListener mErrorListener;
private final String mRequestBody;
private final String PROTOCOL_CHARSET = "utf-8";
private final String PROTOCOL_CONTENT_TYPE = String.format("application/json; charset=%s", PROTOCOL_CHARSET);
public BooleanRequest(int method, String url, String requestBody, Response.Listener<Boolean> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mListener = listener;
this.mErrorListener = errorListener;
this.mRequestBody = requestBody;
}
@Override
protected Response<Boolean> parseNetworkResponse(NetworkResponse response) {
Boolean parsed;
try {
parsed = Boolean.valueOf(new String(response.data, HttpHeaderParser.parseCharset(response.headers)));
} catch (UnsupportedEncodingException e) {
parsed = Boolean.valueOf(new String(response.data));
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
return super.parseNetworkError(volleyError);
}
@Override
protected void deliverResponse(Boolean response) {
mListener.onResponse(response);
}
@Override
public void deliverError(VolleyError error) {
mErrorListener.onErrorResponse(error);
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public byte[] getBody() throws AuthFailureError {
try {
return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
mRequestBody, PROTOCOL_CHARSET);
return null;
}
}
}
然后在你的 Activity:
try {
JSONObject jsonBody;
jsonBody = new JSONObject();
jsonBody.put("Title", "Android Demo");
jsonBody.put("Author", "BNK");
jsonBody.put("Date", "2015/08/28");
String requestBody = jsonBody.toString();
BooleanRequest booleanRequest = new BooleanRequest(0, url, requestBody, new Response.Listener<Boolean>() {
@Override
public void onResponse(Boolean response) {
Toast.makeText(mContext, String.valueOf(response), Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(mContext, error.toString(), Toast.LENGTH_SHORT).show();
}
});
// Add the request to the RequestQueue.
queue.add(booleanRequest);
} catch (JSONException e) {
e.printStackTrace();
}
我正在尝试使用 android 中的 volley 通过 web-api 向 MVC 服务器发出请求,我想将函数的参数作为 JSON(请求正文),所以我使用 JSONRequest 进行调用,但问题是 JSONRequest 强制您使用 Response.Listner,而我正在调用的函数 returns 一个布尔变量,所以每次调用时我都会遇到转换错误
我尝试进行接受布尔值的自定义调用,但现在出现错误 400,我不知道为什么,有没有办法让 jsonRequest 接收布尔值?如果没有,解决方案是什么?
我第一次使用的功能:
public void getJSON(String controllerName,String actionName, JSONObject requestBody,Response.Listener<JSONObject> success,Response.ErrorListener error){
String url = makeURL(controllerName,actionName);
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,url,requestBody,success,error);
request.setTag(APP_TAG);
requestQueue.add(request);
}
这是我对自定义请求的第二次尝试(出现错误 400):
public void getBooleanRequest(String controllerName,String actionName, final HashMap<String,String> body, final HashMap<String,String> header, final Response.Listener<Boolean> success,Response.ErrorListener error){
String url = makeURL(controllerName,actionName);
Request<Boolean> request = new Request<Boolean>(Request.Method.POST,url,error) {
@Override
protected Response<Boolean> parseNetworkResponse(NetworkResponse response) {
return Response.success(true, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected void deliverResponse(Boolean response) {
success.onResponse(response);
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return body;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return header;
}
};
request.setTag(APP_TAG);
requestQueue.add(request);
}
您可以试试我下面的示例代码:
private class BooleanRequest extends Request<Boolean> {
private final Response.Listener<Boolean> mListener;
private final Response.ErrorListener mErrorListener;
private final String mRequestBody;
private final String PROTOCOL_CHARSET = "utf-8";
private final String PROTOCOL_CONTENT_TYPE = String.format("application/json; charset=%s", PROTOCOL_CHARSET);
public BooleanRequest(int method, String url, String requestBody, Response.Listener<Boolean> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mListener = listener;
this.mErrorListener = errorListener;
this.mRequestBody = requestBody;
}
@Override
protected Response<Boolean> parseNetworkResponse(NetworkResponse response) {
Boolean parsed;
try {
parsed = Boolean.valueOf(new String(response.data, HttpHeaderParser.parseCharset(response.headers)));
} catch (UnsupportedEncodingException e) {
parsed = Boolean.valueOf(new String(response.data));
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
return super.parseNetworkError(volleyError);
}
@Override
protected void deliverResponse(Boolean response) {
mListener.onResponse(response);
}
@Override
public void deliverError(VolleyError error) {
mErrorListener.onErrorResponse(error);
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public byte[] getBody() throws AuthFailureError {
try {
return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
mRequestBody, PROTOCOL_CHARSET);
return null;
}
}
}
然后在你的 Activity:
try {
JSONObject jsonBody;
jsonBody = new JSONObject();
jsonBody.put("Title", "Android Demo");
jsonBody.put("Author", "BNK");
jsonBody.put("Date", "2015/08/28");
String requestBody = jsonBody.toString();
BooleanRequest booleanRequest = new BooleanRequest(0, url, requestBody, new Response.Listener<Boolean>() {
@Override
public void onResponse(Boolean response) {
Toast.makeText(mContext, String.valueOf(response), Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(mContext, error.toString(), Toast.LENGTH_SHORT).show();
}
});
// Add the request to the RequestQueue.
queue.add(booleanRequest);
} catch (JSONException e) {
e.printStackTrace();
}