2017-04-21 246 views
1

用简单的话说,我想发送这个{"Id":7,"Name":"MyName"}数据到使用Volley Post请求的服务器。Volley Post请求,在Json数组请求中发送Json对象

它有1个整数,且串和响应我得到的是Jsonarray

我尝试以下方法,但没有一个是工作

  • ,因为它是JSON数组要求我不能在参数发送数据为第参数只需要JsonArray,我要送的JSONObject所以保持它作为空

    new JsonArrayRequest(Method,Url,JsonArray,ResponseListener,ErrorListner)

  • 我不能把它在HashMap作为值1是整数,且它仅接受字符串

getParams()方法方法

@Override 
protected Map<String, String> getParams() throws AuthFailureError { 
    Map<String,String> params=new HashMap<>(); 
    params.put("Id",7); //   <====== This is Invalid 
    params.put("Name","MyName"); 
    return params; 
} 
  • 我试图在getbody方法发送,仍无法正常工作

getbody方法

@Override 
public byte[] getBody() { 
    String body="{\"Id\":7,\"Name\":\"MyName\"}"; 
    return body.getBytes(); 
} 

我可以使用HttpUrlConnection得到响应。

还有什么其他方法可以实现它凌空抽射吗?

回答

2

好像它是在最近volley version删除,但你可以很容易地修改此构造并添加到JsonArrayRequest

public JsonArrayRequest(int method, String url, JSONObject jsonRequest, 
          Listener<JSONArray> listener, ErrorListener errorListener) { 
     super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, 
       errorListener); 
    } 
+0

太好了,让我试试 – Redman

0
JSONObject jsonObject = new JSONObject(); 
    try { 
     // user_id, comment_id,status 
     jsonObject.put("user_id", your_data); 
     jsonObject.put("comment_id", your_data); 
     jsonObject.put("status", your_data); 
     jsonObject.put("token", your_data); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, 
      YOUR_API _NAME, jsonObject, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 

// YOUR RESPONSE 
} 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      error.printStackTrace(); 

     } 
    }); 
    mRequestQueue.add(jsonObjReq); 

//}}

0

试试这个:

new JsonArrayRequest(Method,Url,JsonArray,ResponseListener,ErrorListner) 

变化

new JsonObjectRequest(Method,Url,JsonArray,ResponseListener,ErrorListner) 
1

感谢akash93,我终于做到了。这里是如何做到这一点

写一个类MyJsonArrayRequest.java像下面

import com.android.volley.NetworkResponse; 
import com.android.volley.ParseError; 
import com.android.volley.Response; 
import com.android.volley.toolbox.HttpHeaderParser; 
import com.android.volley.toolbox.JsonRequest; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.UnsupportedEncodingException; 
public class MyJsonArrayRequest extends JsonRequest<JSONArray> { 


    public MyJsonArrayRequest(int method, String url, JSONObject jsonRequest, 
           Response.Listener<JSONArray> listener, Response.ErrorListener errorListener) { 
     super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, 
       errorListener); 
    } 

    @Override 
    protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, 
        HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); 
      return Response.success(new JSONArray(jsonString), 
        HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JSONException je) { 
      return Response.error(new ParseError(je)); 
     } 
    } 

用法:

MyJsonArrayRequest request=new MyJsonArrayRequest(Request.Method.POST, Constants.SEARCH_PROFILE, object, new Response.Listener<JSONArray>() { 
     @Override 
     public void onResponse(JSONArray response) { 

      Log.i("onResponse", ""+response.toString()); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      error.printStackTrace(); 
      Log.i("onErrorResponse", "Error"); 
     } 
    }); 

更简单的方法是覆盖getBody()哪个应该可以工作,但是有些方法对我来说并不适合第一次。

@Override 
public byte[] getBody() { 
    String body="{\"Id\":7,\"Name\":\"MyName\"}"; 
    return body.getBytes(); 
}