Google Volley忽略了POST参数

时间:2013-11-04 01:06:26

标签: android http-post android-volley

我目前正尝试通过Google Volley向我的服务器发送简单的POST请求。 因此,我写了以下几行代码:

Map<String, String> params = new HashMap<String, String>();
params.put("regId", "skdjasjdaljdlksajskl");
JSONObject object = new JSONObject(params);
JsonObjectRequest request = new JsonObjectRequest(Method.POST,
                "address_of_my_server/method", object,
                successListener, errorListener);
queue.add(request);

但是我得到了一个错误500,它说,有一个缺失的参数(regId)。我已尝试使用GET-Request进行相同操作,但结果相同。

只有当我使用带有格式化URL的StringRequest时,例如&#34; address_of_my_server / method?regId = sadlasjdlasdklsj&#34;服务器回复200。

当我使用StringRequest时,我得到完全相同的结果:

StringRequest request = new StringRequest(Method.POST,
                "myurl", successListener,
                errorListener){
            @Override
            protected Map<String, String> getParams()
                    throws AuthFailureError {
               Map<String, String> params = new HashMap<String, String>();
               params.put("regId", "skdjasjdaljdlksajskl");
               return params;
            }
        };

为什么Volley忽略了我的参数?

5 个答案:

答案 0 :(得分:3)

我上周遇到了同样的问题,但现在已经修好了。 您的服务器接受Content-Type作为表单数据,当发送volley的JsonObjectRequest时,请求的content-type将是application / json,因此整个params将作为一个json主体发送,而不是作为Stringrequest中的键值对。 更改服务器代码以从http请求正文获取请求参数,而不是从密钥获取它(如php中的$ _REQUEST ['name'])。

答案 1 :(得分:3)

使用此助手类:

import java.io.UnsupportedEncodingException;
import java.util.Map;    
import org.json.JSONException;
import org.json.JSONObject;    
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;

public class CustomRequest extends Request<JSONObject> {

private Listener<JSONObject> listener;
private Map<String, String> params;

public CustomRequest(String url, Map<String, String> params,
        Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(Method.GET, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

public CustomRequest(int method, String url, Map<String, String> params,
        Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(method, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

protected Map<String, String> getParams()
        throws com.android.volley.AuthFailureError {
    return params;
};

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

@Override
protected void deliverResponse(JSONObject response) {
    // TODO Auto-generated method stub
    listener.onResponse(response);
    }
}

答案 2 :(得分:2)

以Rajesh Batth提到

的问题为例

Java代码:

    JSONObject obj = new JSONObject();
    try {
        obj.put("id", "1");
        obj.put("name", "myname");
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(
            Request.Method.POST, url, obj, listener, errorlistener);

    RequestQueue queue = Volley.newRequestQueue(context);
    queue.add(jsObjRequest);

PHP-代码:

    $body = file_get_contents('php://input');
    $postvars = json_decode($body, true);
    $id = $postvars["id"];
    $name = $postvars["name"];

注意:

如果您没有发送额外的GET-VARS,则PHP-Vars $_POST$_REQUEST以及$_GET为空。

答案 3 :(得分:1)

编辑:

我删除了之前的答案,因为它不准确。

我会回顾我今天所知道的: 显然,getParams应该有效。但它并不总是如此。 我自己调试了它,似乎在执行PUT或POST请求时调用它,并且该方法中提供的参数在常规GET参数字符串(?param1=value1&param2=value2 ...)中并编码和放置在体内。

我不知道为什么但是由于某些原因这对某些服务器不起作用。

我知道发送参数的最佳替代方法是将参数放在JSONObject中,并使用请求构造函数将其内容编码在请求的正文中。

答案 4 :(得分:0)

这是我的解决方案

解决方案 1

 public void getData() {
    final RequestQueue queue = Volley.newRequestQueue(this);
    StringRequest postRequest = new StringRequest(Request.Method.POST, "192.168.0.0/XYZ",new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONArray myArray = new JSONArray(response);

                        for(int i = 0; i < myArray.length(); i++)
                        {
                            JSONObject jObj = myArray.getJSONObject(i);
                            String category = jObj.getString("nameUser");
                            Log.e("value", category);

                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.e("error: ", e.getMessage());
                    }

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //Toast.makeText(context,"Error : ").show();
        }
    }){
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("id_user", "1");
            return params;
        }
    };
    queue.add(postRequest);
}

解决方案 2

记住,如果你使用php,$ _POST [''];
不工作,her更多信息。

祝你好运