2013-08-28 36 views
6

請問Volley是否會自動將我的GET參數添加到URL?對我來說,這不工作,所以當查看源代碼時,我無法找到getParams方法的任何調用。 那麼我應該自己構建URL嗎?這是一點問題都沒有,我只是認爲,當有喜歡getParams這樣的方法,它可以爲我做的:)Volley不會爲我的自定義請求調用getParams?

更新:下面是我的代碼..

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); 
    } 
} 

其實PARAMS參數現在冗餘

回答

10

getParams()未在GET方法上調用,因此您似乎必須在發送請求之前將其添加到URL。

退房的JavaDoc:

返回地圖的參數,可用於POST或PUT請求。

可能會拋出{@link AuthFailureError},因爲可能需要身份驗證 來提供這些值。

請注意,您可以直接覆蓋自定義 數據的{@link #getBody()}。

在身份驗證失敗

+0

謝謝..我想我應該嘗試閱讀javadoc :) – simekadam

+0

是否有任何特定的原因,爲什麼getPrams()沒有調用GET? – ANinJa

0

試試這個,

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; 
    } 
} 

看到這個例子中,也

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

+1

Well..thats actuallt像我有it..I試圖把一個斷點放入getParams()方法中,並且它永遠不會破壞:/ 我也看到了與Volley一起提供的HurlStack和HttpClientStack,並且沒有調用該方法..關於頭文件和等等,但除了HttpClientStack中的兩行代碼外設置一些超時,沒有調用getParams()... – simekadam

1

至於Itai Hanski答案的情況下@throws AuthFailureError,這是一個例子來實現的是:

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