2013-08-28 70 views
6

Xin vui lòng, Volley có tự động thêm thông số GET của tôi vào URL không? Đối với tôi nó không hoạt động như vậy và cũng khi nhìn vào các nguồn, tôi chỉ không thể tìm thấy bất kỳ cuộc gọi của phương pháp getParams .. Vì vậy, tôi có nên tự xây dựng URL không? Đó là không có vấn đề gì cả, tôi chỉ nghĩ rằng khi có phương pháp như vậy như getParams, nó có thể làm điều đó cho tôi :)Volley không gọi getParams cho yêu cầu tùy chỉnh của tôi?

UPDATE: Dưới đây là mã của tôi ..

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

Trên thực tế tham số params là hiện nay dư thừa

Trả lời

10

getParams() không được gọi trên phương thức GET, vì vậy có vẻ như bạn sẽ phải thêm URL đó vào URL trước khi gửi yêu cầu.

Kiểm tra javadoc:

Trả về một Bản đồ các thông số được sử dụng cho một POST hoặc yêu cầu PUT.

Có thể ném {@link AuthFailureError} vì xác thực có thể được yêu cầu để cung cấp các giá trị này.

Lưu ý rằng bạn có thể ghi đè trực tiếp {@link #getBody()} cho dữ liệu tùy chỉnh.

@throws AuthFailureError trong trường hợp thất bại auth

+0

cảm ơn .. Tôi đoán tôi nên cung cấp cho một thử đọc javadoc :) – simekadam

+0

là có bất kỳ lý do cụ thể, tại sao getPrams() không được gọi là GET? – ANinJa

0

Hãy thử điều này,

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

Xem ví dụ này cũng có,

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

+1

Well..thats actuallt như tôi có it..I cố gắng để đặt một breakpoint vào getParams() phương pháp và nó không bao giờ phá vỡ ở đó:/ Tôi cũng đã nhìn bohth vào HurlStack và HttpClientStack được cung cấp với Volley và không có cuộc gọi đến phương pháp đó .. Có rất nhiều liên quan đến tiêu đề và như vậy, nhưng ngoại trừ hai dòng trong HttpClientStack, nơi nó đặt một số timeouts, không có cuộc gọi của getParams() ... – simekadam

1

Đối với Itai Hanski câu trả lời, đây là một ví dụ để thực hiện điều đó:

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