Android Volley似乎没有发布HTTP参数

时间:2014-02-27 14:53:20

标签: android android-volley

我在StackOverflow上看过其中的一些问题,但我似乎无法解释为什么这段代码对我不起作用。

public void postMethod(final String msg) {

    String url = "http://192.168.1.30/endpoint";

    RequestQueue queue = Volley.newRequestQueue(this);
    StringRequest sr = new StringRequest(Request.Method.POST, url, 
        new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            // Handle response...
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // Handle error...
        }
    }){
        @Override
        protected Map<String,String> getParams(){
            Map<String,String> params = new HashMap<String, String>();
            params.put("msg", msg);

            return params;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String,String> params = new HashMap<String, String>();
            params.put("Content-Type","application/x-www-form-urlencoded");
            return params;
        }
    };
    queue.add(sr);
}

我正在尝试对运行python flask应用程序的服务器发出POST。如果我使用程序来发出HTTP Post请求我的服务器应用程序工作正常。如果我使用AsyncTask并且做了Volley试图为我做的事情,它也会正常工作。

从我看到的所有示例中,此代码应该可以正常工作,但我的烧瓶服务器永远不会收到任何POST参数。有什么想法可能会发生什么?

修改

服务器代码:

from flask import Flask, request, abort
app = Flask(__name__)

@app.route('/endpoint', methods=['POST'])
def echo_msg():
    if request.method == 'POST':
        try:
            msg = request.form['msg']
            return msg

        except KeyError, e:
            # A required parameter is missing.
            abort(400)

4 个答案:

答案 0 :(得分:7)

您需要覆盖getBodyContentType()并返回“application / x-www-form-urlencoded; charset = UTF-8”;

Tuple<T1, T2, T3>

答案 1 :(得分:0)

尝试使用正文传递参数,就像在JsonObjectRequest中完成的那样。

JsonObjectRequest中,您可以将JSONObject设置为请求的正文。我建议您将请求类型切换为此类型,或者覆盖getBody() StringRequest方法,类似于JsonRequest中的方式(第93行)。

答案 2 :(得分:0)

希望你已经解决了这个问题。在实现与您类似的代码时,我遇到了类似的问题。 下面的代码实际上对我有用。感谢

public void postMethod(final String msg) {

String url = "http://192.168.1.30/endpoint";

Map<String,String> params = new HashMap<String, String>();
        params.put("msg", msg);

RequestQueue queue = Volley.newRequestQueue(this);
StringRequest sr = new StringRequest(Request.Method.POST, url, new JSONObject (params),
    new Response.Listener<String>() {

    @Override
    public void onResponse(String response) {
        // Handle response...
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        // Handle error...
    }
}){
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String,String> params = new HashMap<String, String>();
        params.put("Content-Type","application/x-www-form-urlencoded");
        return params;
    }
};
queue.add(sr);

}

希望这可以帮助任何遇到过这样问题的人。谢谢。

答案 3 :(得分:0)

您可以使用编码的表单application / x-www-form-urlencoded only this method

@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded";
}