Java Android通过截击在REST GET调用的头中传递json
我正在为我的Android应用程序使用Volley进行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
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是非常不传统的,但这是服务器人员坚持的,他是我的老板。