2015-04-21 112 views
1

我有一個自定義排球請求,但發送請求時沒有帶上我的參數,我的代碼出了什麼問題? 我在getParamsgetPostParams設置了一個斷點,但沒有一個經過。排隊請求不參數

我使用了com.mcxiaoke.volley:library:1.0.+,它是從谷歌排除分支支持maven。

我發現這個類在真實設備上運行良好,但不能在genymotion上工作。

public class GsonRequest<T> extends Request<T> { 
    private Class<T> clazz; 
    private Map<String, String> headers; 
    private Map<String, String> params; 
    private Listener<T> listener; 

    public GsonRequest(Api api, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) { 
    this(api, clazz, null, null, listener, errorListener); 
    } 

    public GsonRequest(Api api, Class<T> clazz, Map<String, String> params, Listener<T> listener, 
     ErrorListener errorListener) { 
    this(api, clazz, params, null, listener, errorListener); 
    } 

    /** 
    * Make a GET request and return a parsed object from JSON. 
    * 
    * @param url 
    *   URL of the request to make 
    * @param clazz 
    *   Relevant class object, for Gson's reflection 
    * @param headers 
    *   Map of request headers 
    */ 
    public GsonRequest(Api api, Class<T> clazz, Map<String, String> params, Map<String, String> headers, 
     Listener<T> listener, ErrorListener errorListener) { 
    super(api.method, api.url, errorListener); 
    this.clazz = clazz; 
    this.params = params; 
    this.headers = headers; 
    this.listener = listener; 
    } 

    // use new GsonRequest() 
    @Deprecated 
    public GsonRequest(String url, Class<T> clazz, Map<String, String> headers, Listener<T> listener, 
     ErrorListener errorListener) { 
    super(Method.GET, url, errorListener); 
    this.clazz = clazz; 
    this.headers = headers; 
    this.listener = listener; 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
    return headers != null ? headers : super.getHeaders(); 
    } 

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

    @Override 
    public Map<String, String> getPostParams() throws AuthFailureError { 
    Map<String, String> result = params; 
    return result; 
    } 

    @Override 
    protected void deliverResponse(T response) { 
    listener.onResponse(response); 
    } 

    @Override 
    protected Response<T> parseNetworkResponse(NetworkResponse response) { 
    try { 
     String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers, "utf-8")); 
//  Log.d("zhch", json); 
     return Response.success(GsonUtils.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)); 
    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } catch (JsonSyntaxException e) { 
     return Response.error(new ParseError(e)); 
    } 
    } 
} 

回答

3

此答案假定您正在嘗試發出GET請求。

我有類似的問題。當使用Volley時,GET請求與POST有點不同。 當您發出GET請求時,其中一種傳遞參數的方法是在url字符串本身內部,這對我有效:

(這是一個部分示例,但應該給你大部分需要修改的內容你自己的代碼)

在發送我用一個小方法來將PARAMS追加到URL請求的類:

//this method sits somewhere in your class 
private String createGetWithParams(String url, Map<String, Object> params) 
{ 
    StringBuilder builder = new StringBuilder(); 
    for (String key : params.keySet()) 
    { 
     Object value = params.get(key); 
     if (value != null) 
     { 
      try 
      { 
       value = URLEncoder.encode(String.valueOf(value), HTTP.UTF_8); 
       if (builder.length() > 0) 
        builder.append("&"); 
       builder.append(key).append("=").append(value); 
      } 
      catch (UnsupportedEncodingException e) 
      { 
      } 
     } 
    } 

    return (url += "?" + builder.toString()); 
} 


//this method sits somewhere in the same class, this fires the request 
public void doSomeRequest() 
{ 
    Map<String, Object> jsonParams = new HashMap<>(); 
    jsonParams.put("SomeParam", SomeParamValue); 
    jsonParams.put("SomeOtherParam", SomeOtherParamValue); 

    String url = createGetWithParams("some/request/url", jsonParams); 

    StringRequest request = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() 
      { 
       @Override 
       public void onResponse(String response) 
       { 
       // do whatever 
       } 
      }, 
      new Response.ErrorListener() 
      { 
       @Override 
       public void onErrorResponse(VolleyError error) 
       { 
        if (null != error.networkResponse) 
        { 
         Log.d(" Volley Error Response code: ", ""+ error.networkResponse.statusCode); 
        } 
       } 
      }); 

     requestQueue.add(request); 

我還創建了更換StringRequest自定義請求類,但那是對解析響應有更多的控制 - 雖然可以幫助你,但在這個類中我只覆蓋響應:

public class CustomStringRequest extends StringRequest 
{ 
private final Response.Listener<String> mListener; 

public CustomStringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) 
{ 
    super(method,url, listener, errorListener); 
    mListener = listener; 
} 

@Override 
protected Response<String> parseNetworkResponse(NetworkResponse response) 
{ 
    try 
    { 
     // response.data is the byte array, do whatever.. 
     String responseBody = new String(response.data, "utf-8"); 
     Log.d(" NetworkResponse", responseBody); 

     return (Response.success(responseBody, getCacheEntry())); 
    } 
    catch (UnsupportedEncodingException e) 
    { 
     VolleyLog.e("UnsupportedEncodingException"); 
     Log.d("NetworkResponse Exception", e.getMessage()); 
     return (null); 
    } 
} 

@Override 
protected void deliverResponse(String response) 
{ 
    mListener.onResponse(response); 
} 

}

我知道的是使用特定的HTTP客戶端的其他方式,我沒有使用過這種方式,但你很可能使用OkHttp,或類似的東西。

希望這會有所幫助!

+0

謝謝。但是我做了一個POST請求。問題是請求在真實設備上運行良好,但不能在genymotion – Malloc

+0

上工作,您可以詳細說明一些嗎?給一些日誌打印?你有沒有得到任何ErrorResponse或請求甚至沒有離開模擬器進入網絡? – TommySM

+0

對不起,我沒有更多的信息可以得到。沒有err日誌和ErrorResponse,只是錯誤邏輯響應缺少參數(請求被髮送並由服務器處理)。安裝在真實設備上的相同代碼可以工作。 – Malloc