簡體   English   中英

Android通過Volley在REST GET調用的標頭中傳遞json

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM