2013-11-07 4 views
65

Я пользуюсь андроид-волейболом для запроса. Поэтому я использую этот код. Я ничего не понимаю. Я проверяю мой сервер, что параметры всегда равны нулю. Я считаю, что getParams() не работает. Что я должен сделать, чтобы решить эту проблему.Volley JsonObjectRequest Сообщение не работает

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); 
+5

Thx для вас вопрос. У меня также возникли проблемы с JsonObjectRequest. Итак, я просто использую обычный StringRequest. Тогда это сработало. Кажется, это ошибка волейбола. Могу я узнать, как вы это решили? – Megamind

+0

Да, конечно. вам нужно создать свой CustomJsonObjectRequest, например, здесь http://stackoverflow.com/questions/19837820/volley-jsonobjectrequest-post-request-not-working – pmb

+0

Спасибо, что спросили! У меня тоже проблема: –

ответ

121

попробовать использовать этот вспомогательный класс

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); 
+1

Thx это работает! Почему переопределение getParams() в JsonObjectRequest не работает? Это ошибка Volley? – Megamind

+0

Его работа для меня, но как и почему. что не так с getParems mehthod. –

+0

Ничего себе! работает как шарм. Спасибо, что вы спасли мой день. Есть ли способ сообщить об этой ошибке Google, чтобы другие разработчики не тратили время на это? –

5

Простой для меня! Я получил это несколько недель назад:

Это относится к методу 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; 

} 

(я предположил, что вы хотите, чтобы отправить Params вы написали в своих 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)); 

и если вы хотите еще больше этой последней строки Params приходит от:

param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString(); 

и paramasJObj что-то вроде этого: {"id"="1","name"="myname"} обычная строка JSON.

+0

Я не понимаю, как передать параметры здесь. Строка s = новая строка (параметр). Что это? – pmb

+0

это просто строка с моими параметрами. Я отправляю его в конструктор. Я покажу вам еще кое-что. – Poutrathor

+0

Спасибо @poutrathor, если вы можете сказать мне, как отправить эти параметры в метод getParams(). – pmb

26

Вы можете создать обычай 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); 
+0

приятно и быстро! но если вам нужно x-www-urlencoded, это делается волейболом? – Poutrathor

+0

Я не уверен, но вы можете легко протестировать его. –

+0

Вы уверены, что getParams не будет вызван? Наоборот, код показывает, что он вызывается getBody() и getPostParams(), и вы говорите себе противоположное: http://stackoverflow.com/questions/18484647/volley-does-not-call-getparams-for-my -custom-request – Poutrathor

1

Все, что вам нужно сделать это, чтобы переопределить метод getParams в классе Request. У меня была та же проблема, и я искал ответы, но я не мог найти подходящую. Проблема в отличие от запроса запроса, параметры отправки, перенаправленные серверами, могут быть удалены. Например, прочитайте this. Таким образом, не рискуйте, чтобы ваши запросы были перенаправлены веб-сервером. Если вы нацеливаете http://example/myapp, укажите точный адрес вашей службы, то есть http://example.com/myapp/index.php.
Волейбол в порядке и работает отлично, проблема возникает из другого места.

1

Функция переопределения getParams отлично работает. Вы используете метод POST, и вы установили jBody как null. Вот почему это не работает. Вы можете использовать метод GET, если хотите отправить null jBody. Я переопределяю метод getParams и работает либо с методом GET (и null jBody), либо с помощью метода POST (и jBody!= Нуль)

Также есть все примеры here

0

При работе с JSONObject запрашивают вам нужно передать параметры сразу после пройти по ссылке в инициализации, посмотрите на этот код:

 HashMap<String, String> params = new HashMap<>(); 
     params.put("user", "something"); 
     params.put("some_params", "something"); 

    JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "your_link", new JSONObject(params), new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 

      // Some code 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      //handel errors 
     } 
    }); 


} 
Смежные вопросы