2017-03-10 17 views
0

我正在使用Volley进行我的Android应用程序的REST连接。Android在传递JSON的REST GET调用中使用Volley

我无法弄清楚在进行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,如果我只是把它传递一个平坦的HashMap,但该呼叫我需要多层次发送更复杂的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不能转换为一个简单的地图

顺便说一句,我不能传带 公共字符串的getURL(`) 头出于某种原因,我们的REST服务器忽略它,我有改为使用getHeaders()函数。

+0

通过我知道这是非常规的通过JSON像这样在头的方式,但这个是服务器的人坚持,他是我的老板。 – user3561494

回答

0

研究发现,工作了黑客:

headers.put("Cookie", "userSession="+app.dataMgr.currentUser.token); 
headers.put("json", <<my json object converted into readable text>>); 
相关问题