2013-08-28 17 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); 
}