【问题标题】:Android passing json in a header in a REST GET call with VolleyAndroid 在使用 Volley 的 REST GET 调用的标头中传递 json
【发布时间】:2017-03-10 17:39:11
【问题描述】:

我将 Volley 用于我的 Android 应用程序的 REST 连接。

在进行 GET 调用时,我无法弄清楚如何在标头中传递复杂的 JSON 数据。

这是我的自定义请求:

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无法转换为简单地图

顺便说一句,我不能用 公共字符串 getUrl(`) 出于某种原因,我们的 REST 服务器忽略了它,我必须改用 getHeaders() 函数。

【问题讨论】:

  • 顺便说一句,我知道在标头中传递这样的 json 是非常规的,但这是服务器人坚持的,他是我的老板。

标签: java android json rest android-volley


【解决方案1】:

找到一个有效的破解方法:

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

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 2011-03-16
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2012-08-10
    • 2014-08-24
    相关资源
    最近更新 更多