【问题标题】:Android volley post params other than string字符串以外的Android volley post参数
【发布时间】:2025-12-29 23:10:12
【问题描述】:

我正在使用 Volley lib 来触发我的请求。我创建了一个自定义类,它像这样扩展Request<T>

class CustomRequest<T> extends Request<T>

使用 GET 的每个请求都非常有效。

我有一些关于 POST 方法的请求。例如登录需要登录名和密码,所以我把Map放在类的getParams()中,一切都很好。但是我在另一个请求上遇到了问题,因为我需要使用任何类型的值(例如 int、array 等)放置参数...这里的示例是设法通过 POST 将其传递到请求中:

{"items":[12926315]}

那么,我该怎么做呢,因为 Volley 只接受 Map,我当然会收到 400 错误代码。

非常感谢您的帮助!

【问题讨论】:

  • 您可以在发出请求时使用声明自定义BasicNameValuePair
  • 但是 BasicNameValuePair 等待“字符串,字符串”太对了吗?我看不到如何构建它以传递 {"items":[12926315]} 格式

标签: android post request android-volley


【解决方案1】:

我刚刚发现它为什么不起作用,我需要重写getBodyContentType()方法

public String getBodyContentType()
    {
        return "application/json";
    }

现在它可以工作了!希望这会有所帮助:)

【讨论】:

    【解决方案2】:
    public class StringRequest extends Request<String> {
    private final Listener<String> mListener;
    /**
     * Creates a new request with the given method.
     *
     * @param method the request {@link Method} to use
     * @param url URL to fetch the string at
     * @param listener Listener to receive the String response
     * @param errorListener Error listener, or null to ignore errors
     */
    public StringRequest(int method, String url, Listener<String> listener,
            ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
    }
    /**
     * Creates a new POST request.
     *
     * @param url URL to fetch the string at
     * @param listener Listener to receive the String response
     * @param errorListener Error listener, or null to ignore errors
     */
    public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
        this(Method.POST, url, listener, errorListener);
    }
    @Override
    protected void deliverResponse(String response) {
        mListener.onResponse(response);
    }
    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String parsed;
        try {
            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            parsed = new String(response.data);
        }
        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
    }
    

    }

    希望这会很好。

    【讨论】:

    • 感谢 Rajeev ;) 一个问题如何在您的示例中传递帖子参数?我刚刚编辑了我的帖子,如果你能看一下,非常感谢
    【解决方案3】:

    编辑

    因此,如果我像下面这样使用JsonObjectRequest,并传递 JSONObject POST 数据,它工作得很好,但我想在我的班级中的 Volley 的 getBody 中发布我的 JSONObject,它扩展了 Request&lt;T&gt; 但它不起作用,因为我猜是 JSONObject 被投射并添加了一些引号

    JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, dataToPost,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d("LOG", "+++++++++ success");
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e("LOG", "--------- error");
                        }
                    })
                    {
                    };
    

    这里是我的 JSONObject:

    JSONObject dataToPost = new JSONObject();
    JSONArray jsa = new JSONArray();
    jsa.put(12926315);
    jsa.put(12998018); 
    dataToPost.put("items", jsa);
    

    这里是getBody方法:

    public byte[] getBody() throws AuthFailureError {
    return postJson.toString().getBytes();  // postJson is dataToPost     
        }
    

    但是从服务器端,响应是 {"items":'[12926315, 12998018]'} 而它等待 {"items":[12926315, 12998018]}

    有什么想法吗?

    【讨论】: