2013-08-28 10 views
6

Per favore, Volley aggiunge automaticamente i miei parametri GET all'URL? Per me non funziona così e anche quando guardo le fonti, non riesco a trovare alcuna chiamata del metodo getParams .. Quindi dovrei creare l'URL da solo? Non è un problema a tutti, ho solo pensato che, quando c'è una tale metodo come getparams, potrebbe farlo per me :)Volley non chiama getParams per la mia richiesta personalizzata?

UPDATE: Qui di seguito è il mio codice ..

public class BundleRequest extends com.android.volley.Request<Bundle>{ 

    private String token; 
    private OnAuthTokenValidatorResponseListener mListener; 
    private final Map<String, String> mParams = new HashMap<String, String>();; 


    public BundleRequest(int method, String url, Response.ErrorListener listener) { 
     super(method, url, listener); 
    } 

    public BundleRequest(int method, String url,OnAuthTokenValidatorResponseListener providedListener, Response.ErrorListener listener, String token) { 
     super(method, url, listener); 
     this.token = token; 
     mListener = providedListener; 
     mParams.put(AuthenticatorConfig.TOKEN_VALIDATION_PARAMNAME, token); 

    } 

    @Override 
    public Map<String, String> getParams() throws AuthFailureError { 
     return mParams; 
    } 




    @Override 
    protected Response<Bundle> parseNetworkResponse(NetworkResponse httpResponse) { 
     switch (httpResponse.statusCode) { 
      case AuthTokenValidator.TOKEN_VALID_RESPONSE_CODE: 
       //token is ok 
       JSONObject response; 
       try { 
         response = new JSONObject(new String(httpResponse.data, HttpHeaderParser.parseCharset(httpResponse.headers))); 
         Bundle userDataResponse = new Bundle(); 
         userDataResponse.putInt("responseCode", httpResponse.statusCode); 
         userDataResponse.putString("username", response.getString("user_id")); 
         userDataResponse.putString("email", response.getString("user_email")); 
         userDataResponse.putString("expiresIn", response.getString("expires_in")); 
         userDataResponse.putString("scope", response.getJSONArray("scope").getString(0)); 
         userDataResponse.putString("token", token); 
        return Response.success(userDataResponse, HttpHeaderParser.parseCacheHeaders(httpResponse)); 
        } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
        return Response.error(new VolleyError("Unsupported encoding")); 


       } catch (JSONException e) { 
        e.printStackTrace(); 
        return Response.error(new VolleyError("Problem while parsing JSON")); 
       } 




      case AuthTokenValidator.TOKEN_INVALID_RESPONSE_CODE: 
       //token is not valid 
       mListener.onValidatorResponse(httpResponse.statusCode); 
       try { 
        mListener.onValidatorResponse(parseOnErrorResponse(new String(httpResponse.data, HttpHeaderParser.parseCharset(httpResponse.headers)))); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 

      default: 
       return Response.error(new VolleyError("Error status code:" + httpResponse.statusCode)); 

     } 
    } 

    protected int parseOnErrorResponse(String responseBody) { 
     try { 
      JSONObject response = new JSONObject(responseBody); 
      String moreInfo = response.getString("more_info"); 
      if (moreInfo.equals("Token was not recognised")) { 
       return AuthTokenValidator.TOKEN_WAS_NOT_RECOGNISED; 
      } else if (moreInfo.equals("Token has expired")) { 
       return AuthTokenValidator.TOKEN_HAS_EXPIRED; 
      } else if (moreInfo.equals("Client doesn't exist anymore")) { 
       return AuthTokenValidator.CLIENT_DOES_NOT_EXIST_ANYMORE; 
      } else if (moreInfo.equals("Client is locked")) { 
       return AuthTokenValidator.CLIENT_IS_LOCKED; 
      } else { 
       return AuthTokenValidator.UNKNOWN_ERROR; 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
      return AuthTokenValidator.UNKNOWN_ERROR; 
     } 

    } 

    @Override 
    protected void deliverResponse(Bundle response) { 
     mListener.onGetUserDataResponse(response); 
    } 
} 

In realtà il parametro params è ora ridondante

risposta

10

getParams() non viene chiamato nel metodo GET, quindi sembra che sarà necessario aggiungerlo all'URL prima di inviare la richiesta.

Partenza JavaDoc:

Restituisce una mappa di parametri da utilizzare per una richiesta POST o PUT.

Può lanciare {@link AuthFailureError} in quanto potrebbe essere richiesta l'autenticazione per fornire questi valori.

Si noti che è possibile sovrascrivere direttamente {@link #getBody()} per dati personalizzati .

@throws AuthFailureError in caso di fallimento di autenticazione

+0

grazie .. Immagino che dovrei provare a leggere javadoc :) – simekadam

+0

c'è qualche ragione specifica, perché getPrams() non viene chiamato su GET? – ANinJa

0

Prova questa,

public class LoginRequest extends Request<String> { 

    // ... other methods go here 

    private Map<String, String> mParams; 

    public LoginRequest(String param1, String param2, Listener<String> listener, ErrorListener errorListener) { 
     super(Method.POST, "http://test.url", errorListener); 
     mListener = listener; 
     mParams.put("paramOne", param1); 
     mParams.put("paramTwo", param2); 

    } 

    @Override 
    public Map<String, String> getParams() { 
     return mParams; 
    } 
} 

Vedi questo esempio anche,

https://github.com/evancharlton/folly/

+1

Well..thats actuallt come ho it..I ho provato a inserire un punto di interruzione nel metodo getParams() e non si interrompe mai:/ Ho anche guardato bohth in HurlStack e HttpClientStack che sono forniti con Volley e non c'è nessuna chiamata a quel metodo .. C'è molto per quanto riguarda le intestazioni e così via, ma tranne due linee in HttpClientStack dove imposta alcuni timeout, non vi è alcuna chiamata di getParams() ... – simekadam

1

Per quanto riguarda Itai Hanski risposta, questo è un esempio di attuare tale:

for(String key: params.keySet()) { 
    url += "&"+key+"="+params.get(key); 
} 
Problemi correlati