[英]Code not going inside the Request method of REST get call using volley in android
[英]Android passing json in a header in a REST GET call with Volley
我将Volley用于我的Android应用程序的REST连接。
我无法弄清楚在进行GET调用时如何在标头中传递复杂的JSON数据。
这是我的CustomRequest:
public class CustomRequest extends Request<JSONObject>
{
private int mMethod;
private String mUrl;
private Map<String, String> mParams; //for post
private Map<String, String> mHeaders; //for get
private Listener<JSONObject> mListener;
private JSONObject mJson;
public String token = "";
public CustomRequest(int method, String url, Map<String, String> params,Map<String, String> headers,
Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mMethod = method;
this.mUrl = url;
this.mParams = params;
this.mHeaders = headers;
this.mListener = reponseListener;
}
public CustomRequest(int method, String url, JSONObject json,
Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.mMethod = method;
this.mUrl = url;
this.mJson = json;
this.mListener = reponseListener;
}
@Override
public String getUrl() {
//we are not doing get this way
if(mMethod == Request.Method.GET) {
StringBuilder stringBuilder = new StringBuilder(mUrl);
Iterator<Map.Entry<String, String>> iterator = mParams.entrySet().iterator();
int i = 1;
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if(i == 1) {
stringBuilder.append("?" + entry.getKey() + "=" + entry.getValue());
} else {
stringBuilder.append("&" + entry.getKey() + "=" + entry.getValue());
}
iterator.remove(); // avoids a ConcurrentModificationException
i++;
}
mUrl = stringBuilder.toString();
}
Log.d("debug",mUrl);
return mUrl;
}
@Override
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return mParams;
};
@Override
public Map<String, String> getHeaders() throws AuthFailureError
{
if(mMethod == Request.Method.GET)
{
/*
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
headers.put("Cookie", "userSession=" + token);
return headers;
*/
return mHeaders;
}
return mParams;
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
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));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
mListener.onResponse(response);
}
@Override
public byte[] getBody()
{
String body = "";
if(mParams != null)
{
JSONObject jsonObject = new JSONObject(mParams);
body = jsonObject.toString();
}
else if(mJson != null)
{
body = mJson.toString();
}
try
{
return body.toString().getBytes("utf-8");
} catch (UnsupportedEncodingException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
它适合POST和GET(如果我只是将其传递给平面哈希图),但是对于此调用,我需要发送具有多个级别的更复杂的JSON:这是我需要在标头中发送的数据:
"Cookie": "userSession=" + dataMgr.savedToken
“json”:
{
“sorting”: (optional)
{
“property”: <string>,
“direction”: <int> (0 = ascending, 1 = descending) (optional)
}
“paging”: (optional)
{
“number”: <int>, (optional)
“size”: <int> (optional)
},}
问题在于此功能:
@Override
public Map<String, String> getHeaders() throws AuthFailureError
返回一个简单的地图,并且我的JSON无法转换为简单的地图
顺便说一句,由于某些原因,我无法通过公共String getUrl(`)传递标头,因此我们的REST服务器会忽略它,而必须使用getHeaders()函数。
找到了一个可行的黑客:
headers.put("Cookie", "userSession="+app.dataMgr.currentUser.token);
headers.put("json", <<my json object converted into readable text>> );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.