![](/img/trans.png)
[英]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.