Почтовый запрос Volley JsonObjectRequest не работает
Я использую android Volley для запроса. Поэтому я использую этот код. Я ничего не понимаю. Я проверяю мой сервер, что параметры всегда равны нулю. Я считаю, что 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);
Ответы
Ответ 1
попробуйте использовать этот вспомогательный класс
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);
}
}
В активности/фрагменте используйте этот
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener());
requestQueue.add(jsObjRequest);
Ответ 2
Вы можете создать пользовательский 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);
Ответ 3
Легко для меня! Я получил это несколько недель назад:
Это используется в методе getBody()
, а не в getParams()
для почтового запроса.
Вот мой:
@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;
}
(Я предположил, что вы хотите POST параметров, которые вы написали в getParams)
Я дал params запросу внутри конструктора, но поскольку вы создаете запрос "на лету", вы можете жестко закодировать их внутри своего переопределения метода 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));
и если вы хотите еще больше, то последние параметры строки исходят из:
param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString();
а paramasJObj примерно такая: {"id"="1","name"="myname"}
обычная строка JSON.
Ответ 4
Когда вы работаете с запросом 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
}
});
}
Ответ 5
Все, что вам нужно сделать, это переопределить метод getParams в классе Request. У меня была та же проблема, и я искал ответы, но я не мог найти подходящую. Проблема в отличие от запроса запроса, параметры отправки, перенаправленные серверами, могут быть удалены. Например, прочитайте этот. Таким образом, не рискуйте, чтобы ваши запросы были перенаправлены веб-сервером. Если вы нацеливаете http://example/myapp, укажите точный адрес своей службы, то есть http://example.com/myapp/index.php.
Волейбол в порядке и отлично работает, проблема возникает где-то в другом месте.
Ответ 6
Функция override getParams работает нормально. Вы используете метод POST, и вы установили jBody как null. Вот почему это не работает. Вы можете использовать метод GET, если хотите отправить null jBody.
Я переопределяю метод getParams, и он работает либо с методом GET (и null jBody), либо с помощью метода POST (и jBody!= Null)
Также есть все примеры здесь
Ответ 7
У меня была одна и та же проблема: пустой массив POST вызывается из-за перенаправления запроса (на стороне вашего сервера), исправьте URL-адрес, чтобы он не перенаправлялся при попадании на сервер. Например, если https принудительно использует файл .htaccess в приложении на стороне сервера, убедитесь, что ваш клиентский запрос имеет префикс "https://". Обычно, когда происходит перенаправление, массив POST теряется. Надеюсь, это поможет!
Ответ 8
Эта ошибка произошла с ее серверной частью. У меня есть дополнительное пустое поле, которое я вообще использовал