4

我目前正在尝试通过 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(如“address_of_my_server/method?regId=sadlasjdlasdklsj”)的 StringRequest 时,服务器才会回复 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 忽略了我的参数?

4

5 回答 5

3

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

于 2013-11-07T03:16:50.097 回答
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);
    }
}
于 2013-11-13T04:52:56.107 回答
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

于 2014-02-13T10:15:28.000 回答
1

编辑:

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

我将回顾一下我今天所知道的:显然,getParams应该工作。但并非总是如此。我自己调试过它,它似乎在执行 PUT 或 POST 请求时被调用,并且该方法中提供的参数位于常规 GET 参数字符串(?param1=value1&param2=value2...)中并编码并放入正文中。

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

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

于 2013-11-04T08:20:34.653 回答
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[''];
不工作,她的更多信息。

祝你好运

于 2015-09-18T05:11:01.690 回答