2017-04-21 221 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(); 
}