Volley Post请求,在Json数组请求中发送Json对象

时间:2017-04-21 10:34:05

标签: android post android-volley

简单地说,我想使用Volley Post Request将此{"Id":7,"Name":"MyName"}数据发送到服务器。

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

我尝试了以下方法,但没有一个正在运作

  • 因为它是json数组请求我不能在参数中发送数据,因为第三个参数只接受JsonArray而我必须发送JsonObject所以保持它为null

    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获取响应。

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

5 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:1)

 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);

//}     }

答案 2 :(得分: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();
}

答案 3 :(得分:0)

试试这个:

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

更改为

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

答案 4 :(得分:0)

为什么不发送params.put("Id",""+7);,然后在后端脚本中将其类型转换为integersay,例如在php中

$id_input = (int)mysqli_real_escape_string($conn,$_POST['Id'])