Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android通过截击在REST GET调用的头中传递json_Java_Android_Json_Rest_Android Volley - Fatal编程技术网

Java Android通过截击在REST GET调用的头中传递json

Java Android通过截击在REST GET调用的头中传递json,java,android,json,rest,android-volley,Java,Android,Json,Rest,Android Volley,我正在为我的Android应用程序使用Volley进行REST连接 在进行GET调用时,我不知道如何在头中传递复杂的JSON数据 这是我的请求: public class CustomRequest extends Request<JSONObject> { private int mMethod; private String mUrl; private Map<String, String> mParams; //for post pr

我正在为我的Android应用程序使用Volley进行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;
    }
}
public类CustomRequest扩展请求
{
私家侦探法;
私人字符串mUrl;
私有映射mParams;//用于post
私有映射mHeaders;//用于获取
私人倾听者;
私人JSONObject mJson;
公共字符串标记=”;
公共CustomRequest(int方法、字符串url、映射参数、映射头、,
侦听器reposeListener,Response.ErrorListener ErrorListener){
super(方法、url、errorListener);
this.mMethod=方法;
this.mUrl=url;
this.mParams=params;
this.mHeaders=标题;
this.mListener=reponListener;
}
公共CustomRequest(int方法、字符串url、JSONObject json、,
侦听器reposeListener,Response.ErrorListener ErrorListener){
super(方法、url、errorListener);
this.mMethod=方法;
this.mUrl=url;
this.mJson=json;
this.mListener=reponListener;
}
@凌驾
公共字符串getUrl(){
//我们不会这样做的
if(mMethod==Request.Method.GET){
StringBuilder StringBuilder=新StringBuilder(mUrl);
迭代器迭代器=mParams.entrySet().Iterator();
int i=1;
while(iterator.hasNext()){
Map.Entry=iterator.next();
如果(i==1){
stringBuilder.append(“?”+entry.getKey()+”=“+entry.getValue());
}否则{
追加(“&”+entry.getKey()+”=“+entry.getValue());
}
迭代器.remove();//避免ConcurrentModificationException
i++;
}
mUrl=stringBuilder.toString();
}
Log.d(“调试”,mUrl);
返回mUrl;
}
@凌驾
受保护的映射getParams()
抛出com.android.volley.AuthFailureError{
返回内存;
};
@凌驾
公共映射getHeaders()引发AuthFailureError
{
if(mMethod==Request.Method.GET)
{
/*
HashMap headers=新的HashMap();
headers.put(“内容类型”、“应用程序/json;字符集=utf-8”);
headers.put(“Cookie”、“userSession=“+token”);
返回标题;
*/
返回mHeaders;
}
返回内存;
}
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应){
试一试{
String jsonString=新字符串(response.data,
HttpHeaderParser.parseCharset(response.headers));
返回Response.success(新的JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(响应));
}捕获(不支持的编码异常e){
返回Response.error(新的ParseError(e));
}捕获(JSONException je){
返回Response.error(newparseerror(je));
}
}
@凌驾
受保护的void deliverResponse(JSONObject响应){
//TODO自动生成的方法存根
mListener.onResponse(response);
}
@凌驾
公共字节[]getBody()
{
字符串体=”;
如果(mParams!=null)
{
JSONObject JSONObject=新的JSONObject(mParams);
body=jsonObject.toString();
}
else if(mJson!=null)
{
body=mJson.toString();
}
尝试
{
返回body.toString().getBytes(“utf-8”);
}捕获(不支持的编码异常e)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
}
POST可以很好地工作,如果我只是给它传递一个平面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)
},}
“Cookie”:“userSession=“+dataMgr.savedToken”
“json”:
{
“排序”:(可选)
{
“财产”:,
“方向”:(0=上升,1=下降)(可选)
}
“分页”:(可选)
{
“编号”:(可选)
“大小”:(可选)
},}
问题在于该功能:

@Override
    public Map<String, String> getHeaders() throws AuthFailureError
@覆盖
公共映射getHeaders()引发AuthFailureError
返回一个简单映射,我的JSON无法转换为简单映射

顺便说一句,我不能通过标题 公共字符串getUrl(`)
出于某种原因,我们的REST服务器忽略了它,我不得不使用getHeaders()函数来代替它。

发现了一个有效的黑客:

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

顺便说一句,我知道在页眉中这样传递json是非常不传统的,但这是服务器人员坚持的,他是我的老板。