volley post請求 gzip壓縮 json 傳輸

這裏以post請求說明,get請求相似設置請求頭及超時。

1.自定義request,繼承com.android.volley.Request

2.構造方法實現(basecallback,爲自定義的監聽,實現Response.Listener,ErrorListener接口)--post請求

String  params;
 public  static    int SOCKET_TIMEOUT=20000;
public  MyRequest(String url,String params, Response.Listener<String> listener, Response.ErrorListener errorListener){
     super(Method.POST,url,listener,errorListener);
    this.params=params;
}


  1. </pre>

3.請求頭設置:重寫getHeaders方法

  1. @Override  
       public Map<String, String> getHeaders() throws AuthFailureError  
       {  
    Map<String, String> headers = new HashMap<String, String>();  
    headers.put("Charset", "UTF-8");  
    headers.put("Content-Type", "application/x-javascript");  
    headers.put("Accept-Encoding", "gzip,deflate");  
    return headers;  
       }

設置字符集爲UTF-8,並採用gzip壓縮傳輸

4.超時設置:重寫getRetryPolicy方法

  1. @Override  
       public RetryPolicy getRetryPolicy()  
       {  
    RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);  
    return retryPolicy;  
       }

5.請求參數組裝:重寫getBody方法

  1. @Override  
       public byte[] getBody() throws AuthFailureError  
       {  
    return params == null ? super.getBody() : params.getBytes();  
       }
  2. 6. 接收到gzip的數據 處理
  3. @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String parsed =getRealString(response.data);
        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
    }<pre name="code" class="java">private int getShort(byte[] data)
    {
        return (int) ((data[0] << 8) | data[1] & 0xFF);
    }
    
    public String getRealString(byte[] data)
    {
        byte[] h = new byte[2];
        h[0] = (data)[0];
        h[1] = (data)[1];
        int head = getShort(h);
        boolean t = head == 0x1f8b;
        InputStream in;
        StringBuilder sb = new StringBuilder();
        try
        {
            ByteArrayInputStream bis = new ByteArrayInputStream(data);
            if (t)
            {
                in = new GZIPInputStream(bis);
            }
            else
            {
                in = bis;
            }
            BufferedReader r = new BufferedReader(new InputStreamReader(in), 1000);
            for (String line = r.readLine(); line != null; line = r.readLine())
            {
                sb.append(line);
            }
            in.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return sb.toString();
    }


    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章