繁体   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