Volley JsonObjectRequest Post запрос не работает
Я использую Android Volley для создания запроса. Поэтому я использую этот код. Я ничего не понимаю. Я проверяю на своем сервере, что params всегда null. Я считаю, что getParams () не работает. Что я должен сделать, чтобы решить эту проблему.
RequestQueue queue = MyVolley.getRequestQueue();
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
System.out.println(response);
hideProgressDialog();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
hideProgressDialog();
}
}) {
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("id","1");
params.put("name", "myname");
return params;
};
};
queue.add(jsObjRequest);
7 ответов:
попробуйте использовать этот вспомогательный класс
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); } }в activity / fragment используйте это
RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener()); requestQueue.add(jsObjRequest);
вы можете создать пользовательскую
JSONObjectReuqestи переопределитьgetParamsметод, или вы можете предоставить их в конструкторе какJSONObjectв теле запроса.вот так (я редактировал ваш код):
JSONObject obj = new JSONObject(); obj.put("id", "1"); obj.put("name", "myname"); RequestQueue queue = MyVolley.getRequestQueue(); JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,obj, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println(response); hideProgressDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { hideProgressDialog(); } }); queue.add(jsObjRequest);
просто для меня ! Я получил его несколько недель назад :
это
getBody()метод, а не вgetParams()для запроса post.вот мой :
@Override /** * Returns the raw POST or PUT body to be sent. * * @throws AuthFailureError in the event of auth failure */ public byte[] getBody() throws AuthFailureError { // Map<String, String> params = getParams(); Map<String, String> params = new HashMap<String, String>(); params.put("id","1"); params.put("name", "myname"); if (params != null && params.size() > 0) { return encodeParameters(params, getParamsEncoding()); } return null; }(Я предполагал, что вы хотите опубликовать параметры, которые вы написали в своем getParams)
Я дал параметры для запроса внутри конструктора, но поскольку вы создаете запрос на лету, вы можете жестко закодировать их внутри своего переопределения метода getBody ().
это то, что моя код выглядит так :
Bundle param = new Bundle(); param.putString(HttpUtils.HTTP_CALL_TAG_KEY, tag); param.putString(HttpUtils.HTTP_CALL_PATH_KEY, url); param.putString(HttpUtils.HTTP_CALL_PARAM_KEY, params); switch (type) { case RequestType.POST: param.putInt(HttpUtils.HTTP_CALL_TYPE_KEY, RequestType.POST); SCMainActivity.mRequestQueue.add(new SCRequestPOST(Method.POST, url, this, tag, receiver, params));и если вы хотите еще больше эту последнюю строку params от :
param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString();и paramasJObj что-то вроде этого :
{"id"="1","name"="myname"}обычная строка JSON.
при работе с запросом JsonObject вам нужно передать параметры сразу после того , как вы передадите ссылку в инициализации, посмотрите на этот код :
HashMap<String, String> params = new HashMap<>(); params.put("user", "something" ); params.put("some_params", "something" ); JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "request_URL", new JSONObject(params), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // Some code } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //handle errors } }); }
все, что вам нужно сделать, это переопределить метод getParams в классе запроса. У меня была та же проблема, и я искал ответы, но я не мог найти правильный. Проблема в том, что в отличие от запроса get, параметры post, перенаправляемые серверами, могут быть отброшены. Например, читать этой. Так что, не рискуйте ваши запросы будут перенаправлены веб-сервером. Если вы используете http://example/myapp, затем укажите точный адрес вашего сервиса, то есть http://example.com/myapp/index.php.
Залп в порядке и работает отлично, проблема проистекает откуда-то еще.
функция переопределения getParams работает нормально. Вы используете метод POST, и вы установили jBody как null. Вот почему это не работает. Вы можете использовать метод GET, если хотите отправить null jBody. Я переопределяю метод getParams, и он работает либо с методом GET (и null jBody), либо с методом POST (и jBody != null)
также есть все примеры здесь
У меня была такая же проблема один раз, пустой массив сообщений вызван перенаправлением запроса (на стороне вашего сервера), исправьте URL-адрес, чтобы его не нужно было перенаправлять, когда он попадает на сервер. Например, если https принудительно использует .файл htaccess на стороне сервера приложения, убедитесь, что ваш запрос клиента имеет префикс "https://". Обычно, когда происходит перенаправление, массив POST теряется. Надеюсь, это поможет!
Comments