OKHttp 是支援HTTP & HTTP/2 的開源框架,透過它可以很方便發送HTTP請求。
具有以下特性:
1.API設計簡單,可以透過幾行code即可發送HTTP請求
2.支援同步,異步請求。同步請求會block目前的Thread,異步請求則不會block
OKHttp官網連結
最新版本釋出
以下紀錄最基本的get, post, post with json format 的使用方式。
1.相依性
在 module 的 build.gradle 加入
dependencies {
...
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
}
Note:目前(2018/09/28)最新版本為3.11.0
2. Using in code
為了封裝OKHttp建立了OKHttpWrapper 類別,外部皆透過該類別來使用OKHttp。
OKHttpWrapper.java
import android.util.Log;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONObject;
public class OKHttpWrapper {
private static final String TAG = OKHttpWrapper.class.getSimpleName();
private static OkHttpClient sOKHttpClient = new OkHttpClient();
public static void sendGet(String URL, Map<String, String> requestParameter, Callback callback) {
Set<String> keys = requestParameter.keySet();
for (String value : keys) {
URL = new StringBuilder(URL + "&" + value + "=" + requestParameter.get(value)).toString();
}
Request request = new Request.Builder().url(URL).build();
Call call = sOKHttpClient.newCall(request);
call.enqueue(callback);
}
public static void sendPost(String URL, Map<String, String> requestParameter, Callback callback) {
FormBody.Builder builder = new FormBody.Builder();
Set<String> keys = requestParameter.keySet();
for (String key : keys) {
builder.add(key, requestParameter.get(key));
}
Request request = new Request.Builder().url(URL).post(builder.build()).build();
Call call = sOKHttpClient.newCall(request);
call.enqueue(callback);
}
public static void sendPostWithJSONFormat(String URL, Map<String, String> requestParameter,
Callback callback) {
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create(JSON, new JSONObject(requestParameter).toString());
Request request = new Request.Builder().url(URL).post(requestBody).build();
Call call = sOKHttpClient.newCall(request);
call.enqueue(callback);
}
}
第19行建立OKHttpClient實體,各個請求皆透過該實體來動作。
第21行sendGet方法為發送GET使用,第1個參數為接收請求的URL,第2個為請求的參數,第3個參數為發送請求之後的回應。
第31行sendPost方法為發送POST使用,第1個參數為接收請求的URL,第2個為請求的參數,第3個參數為發送請求之後的回應。
第44行sendPostWithJSONFormat方法為發送POST但參數的格式為JSON,第1個參數為接收請求的URL,第2個為請求的參數,第3個參數為發送請求之後的回應。
可以看到透過OKHttp發送請求相當簡單,接下來示範外部如何呼叫OKHttpWrapper。接收請求的Server使用httpbin
以下為外部
private void testSendRequest(String name, String id) {
Map<String, String> httpParameter = new HashMap<>();
httpParameter.put("Name", name);
httpParameter.put("ID", id);
OKHttpWrapper.sendPostWithJSONFormat(
"http://httpbin.org/post", httpParameter, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, TAG+" response:"+response.body().string());
}
});
}
第2~4行為組裝請求的參數。
第6行呼叫OKHttpWrapper的sendPostWithJSONFormat方法
第1個參數為為接受請求的URL,第2個參數為請求的參數,第3個參數為發送請求後的回應,其中onFailure為請求失敗的回應。onResponse則為請求成功的回應。
testSendRequest("Foxx", "999");
testSendRequest("Peter", "000");
testSendRequest("May", "111");
Output
"json": {
"ID": "999",
"Name": "Foxx"
},
"json": {
"ID": "000",
"Name": "Peter"
},
"json": {
"ID": "111",
"Name": "May"
},
Orignal From: OKHttp 基本使用紀錄
0 意見:
張貼留言