OkHttp使用介紹

來源:互聯網
上載者:User

標籤:基本   row   failure   rri   public   format   head   jar包   either   

為什麼需要一個HTTP庫

Android系統提供了兩種HTTP通訊類,HttpURLConnection和HttpClient。
關於HttpURLConnection和HttpClient的選擇>>官方部落格
儘管Google在大部分安卓版本中推薦使用HttpURLConnection,但是這個類相比HttpClient實在是太難用,太弱爆了。
OkHttp是一個相對成熟的解決方案,據說Android4.4的源碼中可以看到HttpURLConnection已經替換成OkHttp實現了。所以我們更有理由相信OkHttp的強大。

入門官方資料

官方介紹
github源碼

使用範圍

OkHttp支援Android 2.3及其以上版本。
對於Java, JDK1.7以上。

jar包準備

官方介紹頁面有連結位置。這裡把下載連結也寫在下面。
OkHttp
Okio

基本使用HTTP GET
OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {    Request request = new Request.Builder().url(url).build();    Response response = client.newCall(request).execute();    if (response.isSuccessful()) {        return response.body().string();    } else {        throw new IOException("Unexpected code " + response);    }}

 

Request是OkHttp中訪問的請求,Builder是輔助類。Response即OkHttp中的響應。

Response類:
OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {    Request request = new Request.Builder().url(url).build();    Response response = client.newCall(request).execute();    if (response.isSuccessful()) {        return response.body().string();    } else {        throw new IOException("Unexpected code " + response);    }}

 

response.body()返回ResponseBody類

可以方便的擷取string

public final String string() throws IOExceptionReturns the response as a string decoded with the charset of the Content-Type header. If that header is either absent or lacks a charset, this will attempt to decode the response body as UTF-8.Throws:IOException

 

當然也能擷取到流的形式:

public final InputStream byteStream()

 

HTTP POSTPOST提交Json資料

使用Request的post方法來提交請求體RequestBody

POST提交索引值對

很多時候我們會需要通過POST方式把索引值對資料傳送到伺服器。 OkHttp提供了很方便的方式來做這件事情。

OkHttpClient client = new OkHttpClient();String post(String url, String json) throws IOException {    RequestBody formBody = new FormEncodingBuilder()    .add("platform", "android")    .add("name", "bug")    .add("subject", "XXXXXXXXXXXXXXX")    .build();    Request request = new Request.Builder()      .url(url)      .post(body)      .build();    Response response = client.newCall(request).execute();    if (response.isSuccessful()) {        return response.body().string();    } else {        throw new IOException("Unexpected code " + response);    }}

 

總結

通過上面的例子我們可以發現,OkHttp在很多時候使用都是很方便的,而且很多代碼也有重複,因此特地整理了下面的工具類。
注意:

  • OkHttp官方文檔並不建議我們建立多個OkHttpClient,因此全域使用一個。 如果有需要,可以使用clone方法,再進行自訂。這點在後面的進階教程裡會提到。
  • enqueue為OkHttp提供的非同步方法呼叫,入門教程中並沒有提到,後面的進階教程裡會有解釋。
import java.io.IOException;import java.util.List;import java.util.concurrent.TimeUnit;import org.apache.http.client.utils.URLEncodedUtils;import org.apache.http.message.BasicNameValuePair;import cn.wiz.sdk.constant.WizConstant;import com.squareup.okhttp.Callback;import com.squareup.okhttp.OkHttpClient;import com.squareup.okhttp.Request;import com.squareup.okhttp.Response;  public class OkHttpUtil {    private static final OkHttpClient mOkHttpClient = new OkHttpClient();    static{        mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);    }    /**     * 該不會開啟非同步線程。     * @param request     * @return     * @throws IOException     */    public static Response execute(Request request) throws IOException{        return mOkHttpClient.newCall(request).execute();    }    /**     * 開啟非同步線程訪問網路     * @param request     * @param responseCallback     */    public static void enqueue(Request request, Callback responseCallback){        mOkHttpClient.newCall(request).enqueue(responseCallback);    }    /**     * 開啟非同步線程訪問網路, 且不在意返回結果(實現空callback)     * @param request     */    public static void enqueue(Request request){        mOkHttpClient.newCall(request).enqueue(new Callback() {                        @Override            public void onResponse(Response arg0) throws IOException {                            }                        @Override            public void onFailure(Request arg0, IOException arg1) {                            }        });    }    public static String getStringFromServer(String url) throws IOException{        Request request = new Request.Builder().url(url).build();        Response response = execute(request);        if (response.isSuccessful()) {            String responseUrl = response.body().string();            return responseUrl;        } else {            throw new IOException("Unexpected code " + response);        }    }    private static final String CHARSET_NAME = "UTF-8";    /**     * 這裡使用了HttpClinet的API。只是為了方便     * @param params     * @return     */    public static String formatParams(List<BasicNameValuePair> params){        return URLEncodedUtils.format(params, CHARSET_NAME);    }    /**     * 為HttpGet 的 url 方便的添加多個name value 參數。     * @param url     * @param params     * @return     */    public static String attachHttpGetParams(String url, List<BasicNameValuePair> params){        return url + "?" + formatParams(params);    }    /**     * 為HttpGet 的 url 方便的添加1個name value 參數。     * @param url     * @param name     * @param value     * @return     */    public static String attachHttpGetParam(String url, String name, String value){        return url + "?" + name + "=" + value;    }}

 

進階

進階屬性其實用的不多,這裡主要是對OkHttp github官方教程進行了翻譯。
請看我的另一篇部落格:OkHttp使用進階 譯自OkHttp Github官方教程

OkHttp使用介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.