title: WASP WIKI
1. 主頁
wasp一個緊湊且易于使用的“一體化”網(wǎng)絡解決方案。

問題
談到日常發(fā)展,您不僅需要一個庫來處理網(wǎng)絡,你需要處理模擬調(diào)用,使用多個端點,處理證書和cookie和許多其他boiler plate code。用WASP,你可以輕松處理一切。
wasp內(nèi)部使用:
- Volley for the network stack
- Gson解析
- http堆棧的 OkHttp
wasp提供:
- 簡單的實現(xiàn)
- 模擬反應通過文本文件或自動生成的模型類!
- 請求攔截器向每個呼叫添加屬性(查詢參數(shù),標題,重試策略)
- 基于Api調(diào)用的頭
- 基于API調(diào)用的終點
- 基于Api呼叫的重試策略
- Cookie管理
- 證書管理
- 快速圖像加載 (Painless Image loading)
- RxJava支持
- 請求取消
- 同步請求調(diào)用
- 異步請求調(diào)用
wasp的目標:
- 有許多公開的問題要做出貢獻。抓住這個機會去做些貢獻和提高你的知識!
- 我們想做一些有用的東西,對鼓勵人們?nèi)プ鞒鲐暙I也是有用的!
2.證書管理
您可以通過兩種方式使用此功能:
- 信任所有證書:大多數(shù)時間測試服務器不使用由CA簽署的證書。因此,在SSL握手步驟中,與這些服務器的連接失敗。為了解決這個問題,您可以讓Wasp接受所有證書(請注意,這只能用于測試目的,因為它使連接容易受到安全攻擊。)
GitHubService service = new Wasp.Builder(this)
.setEndpoint("https://api.github.com")
.trustCertificates() //Trust All Certificates
.build()
.create(MyService.class);
- 證書固定:創(chuàng)建您的服務器證書的BKS文件,并將其放在res / raw文件夾下。比起來,讓wasp通過提供您的原始資源ID和密鑰庫密碼將您的證書用于SSL握手與服務器。
GitHubService service = new Wasp.Builder(this)
.setEndpoint("https://api.github.com")
.trustCertificates(R.raw.YOUR_TRUST_STORE, "YOUR_PASSWORD") //Trust only to the given certificates
.build()
.create(MyService.class);
3.貢獻
所有的貢獻都非常歡迎和高度贊賞,目前有很多問題/改進等待解決,你可以基本上接受任何問題和貢獻。
- 請遵循以下規(guī)則:
- 2空格縮進
- Google代碼約定
- 分支全部提交
- 添加測試
4. Cookie管理
您可以通過兩種方式輕松處理Cookie:
- 設置一個CookiePolicy,讓CookieManager使用默認的CookieStore實現(xiàn)
GitHubService service = new Wasp.Builder(this)
.setEndpoint("https://api.github.com")
.enableCookies(CookiePolicy.ACCEPT_ALL)
.build()
.create(MyService.class);
- 還提供自己的CookieStore實現(xiàn),將由CookieManager使用
GitHubService service = new Wasp.Builder(this)
.setEndpoint("https://api.github.com")
.enableCookies(new YourCookieStore(), CookiePolicy.ACCEPT_ALL)
.build()
.create(MyService.class);
5.依賴設置
Gradle
compile 'com.orhanobut:wasp:1.13'
6.URL編碼形式
使用@Field注釋來提供鍵值對
@FormUrlEncoded
@POST("/users/repos")
void fetchRepoBySearch(
@Field("page") int pageNumber,
@Field("sort") String sort,
Callback<Repo> callback
);
service.fetchRepoBySearch(2,"asc", callback);
//output url is ENDPOINT/users/repos?page=2&sort=asc
@FieldMap用于字段添加到fields
(@FieldMap is used to add fields by map)
@FormUrlEncoded
@POST("/users/repos")
void fetchRepoBySearch(
@FieldMap Map queryParamsMap,
Callback<Repo> callback
);
Map<String,String> map = new HashMap<>();
map.put("sort","asc");
map.put("offset", "100");
service.fetchRepoBySearch(map, callback);
7.頭
@Header用于通過使用params添加headers
@GET("/repos")
void fetchRepos(
@Header("auth") String authToken,
RepoCallBack<List<Repo> callBack
);
@Headers用于通過添加到方法添加靜態(tài)headers
//Single static header
@Headers("Accept-Language:en-En")
@GET("/users")
void fetchUsers(
Callback<List<User> callback
);
// Multiple static headers
@Headers({
"Accept-Language:en-En",
"Content-type:application/json"
})
8.Httpstack
您可以設置自定義http堆棧而不是默認值。默認是OkHttp。
GitHubService service = new Wasp.Builder(this)
.setEndpoint("https://api.github.com")
.setHttpStack(new YourHttpStack());
.build()
.create(MyService.class);
實現(xiàn)WaspHttpStack接口并將其傳遞給Wasp
9.圖像處理器 Image Handler
使用wasp,您還可以下載并顯示圖像。wasp也為flickering提供了一個很好的解決方案。
Wasp.Image
.from("url")
.setDefault(R.id.image)
.setError(R.id.image)
.to(imageView)
.load();
10.初始化
創(chuàng)建服務接口
public interface GitHubService {
@GET("/repos/{user}/{repo}")
void getRepo(
@Path("user") String user,
@Path("repo") String repo,
Callback<Repo> callback
);
@Mock
@Headers
@POST("/repos/{user}")
void addName(
@Path("user") String user,
@Header("auth") String authToken,
@Body Repo repo,
Callback<Repo> callback
);
}
初始化wasp
GitHubService service = new Wasp.Builder(this)
.setEndpoint("https://api.github.com")
.setRequestInterceptor // Optional
.trustCertificates // Optional
.setHttpStack // Optional
.enableCookies // Optional
.setNetworkMode(NetworkMode.MOCK) // Optional(Used for Mock)
.build()
.create(MyService.class);
你可以使用了
ervice.fetchRepo("github","wasp", new Callback<List<Repo>>{
@Override
public void onSuccess(WaspResponse response, List<Repo> repos) {
// do something
}
@Override
public void onError(WaspError error) {
// handle error
}
});
11. Mocking
其中一個是wasp最強大的功能,您可以通過使用模擬注釋輕松地模擬您的網(wǎng)絡請求。
@Mock使用關于您的響應類型的自動生成功能模擬
@Mock
@GET("/user")
void fetchUser(
Callback<User> callback
);
@Mock(path =“users.json”):使用本地文件生成模擬。本地文件必須在assets文件夾下。這將通過給定的路徑返回與生成的內(nèi)容的響應,狀態(tài)碼為200
@Mock(path="user.json")
@GET("/user")
void fetchUser(
Callback<User> callback
);
@Mock(statusCode = 404):返回狀態(tài)代碼為404的失敗響應
@Mock(statusCode=404)
@GET("/user")
void fetchUser(
Callback<User> callback
);
@Mock(statusCode = 201):使用狀態(tài)代碼201和自動生成的響應返回成功
@Mock(statusCode=201)
@GET("/user")
void fetchUser(
Callback<User> callback
);
12.多個終點
您可以使用不同的端點網(wǎng)址進行某些網(wǎng)絡調(diào)用,它將覆蓋基本網(wǎng)址。
@EndPoint("http://www.google.com")
@GET("/users")
void fetchUsers(
Callback<List<User>> callback
);
13. Proguard
如果您使用ProGuard,您應該在配置文件中添加以下選項:注意:除了這些選項之外,您還可能需要保留網(wǎng)絡相關的模型類。
#Wasp
-keepattributes *Annotation*
-keep class com.orhanobut.wasp.** { *; }
-keepclassmembernames interface * {
@com.orhanobut.wasp.http.* <methods>;
}
#Gson
-keep class com.google.gson.** { *; }
-keepattributes Signature
#OkHttp
-dontwarn com.squareup.okhttp.**
-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
14.請求體
- @Body可以用來為請求體添加一個對象。對象將被轉(zhuǎn)換為json。
@POST("/repos")
void addName(
@Body Repo repo,
Callback<Repo> callback
);
service.addName(new Repo("3423",3),callback);
- @BodyMap可以用來添加一個Map對象,而不是創(chuàng)建body類。它將被轉(zhuǎn)換為json。您可以使用@BodyMap進行不想創(chuàng)建類的簡單操作。
@POST("/repos")
void addName(
@BodyMap Map map,
Callback<Repo> callback
);
Map map = new HashMap<>();
map.put("ip","3423");
map.put("page",3);
service.addName(map, callback);
15.請求取消
使用WaspRequest作為返回類型,并利用諸如cancel的功能。
@GET("/repos/{user}/{repo}")
WaspRequest getRepo(
@Path("user") String user,
@Path("repo") String repo,
Callback<Repo> callback
);
WaspRequest request = service.getRepo();
request.cancel();
對于多個請求,請使用請求管理器一次取消所有請求
private final RequestManager requestManager = new SimpleRequestManager();
public void onRefreshData(){
WaspRequest request = service.getData();
requestManager.addRequest(request);
}
public void onAnotherNetworkCall() {
WaspRequest request = service.getFoo();
requestManager.addRequest(request);
}
public void onDestroy(){
requestManager.cancelAll();
}
16.請求攔截器
您可以攔截每個請求并添加一些其他信息。您可以實現(xiàn)RequestInterceptor接口或使用SimpleInterceptor類,如果您不需要實現(xiàn)每個功能,請使用SimpleInterceptor。
向每個請求添加headers
RequestInterceptor interceptor = new SimpleInterceptor() {
@Override
public void onHeadersAdded(Map headers) {
super.onHeadersAdded(headers);
headers.put("key","value");
}
}
向每個請求添加其他查詢參數(shù)
RequestInterceptor interceptor = new SimpleInterceptor() {
@Override
public void onQueryParamsAdded(Map params) {
super.onQueryParamsAdded(params);
params.put("name","something");
}
}
向每個請求添加重試策略
RequestInterceptor interceptor = new SimpleInterceptor() {
@Override
public WaspRetryPolicy getRetryPolicy() {
return new WaspRetryPolicy(45000, 3, 1.5f);
}
}
將身份驗證令牌添加到每個請求或過濾的請求中。返回一個接受authtoken值并啟用過濾器的新AuthToken對象。如果啟用了過濾器,那么@Auth注解的所有請求都將在標題中使用auth令牌。如果禁用過濾器,每個請求都將添加令牌。
RequestInterceptor interceptor = new SimpleInterceptor() {
@Override
public AuthToken getAuthToken() {
return new AuthToken(token, true);
}
}
@Auth
@GET("/users")
void fetchUsers(
Callback<List<User> callback
);
最后將其設置為builder
GitHubService service = new Wasp.Builder(this)
.setEndpoint("https://api.github.com")
.setRequestInterceptor(interceptor)
.build()
.create(MyService.class);
16.重試策略
您可以使用請求攔截器為每個調(diào)用設置重試策略
RequestInterceptor interceptor = new SimpleInterceptor() {
@Override
public WaspRetryPolicy getRetryPolicy() {
return new WaspRetryPolicy(45000, 3, 1.5f);
}
}
您可以使用注釋為特定調(diào)用添加特定策略。如果同時使用這兩個注解,則總是覆蓋請求攔截器
@RetryPolicy(timeout = 10000)
@GET("/users")
void fetchUsers(
Callback<List<User>> callback
);
17.Rx支持
將響應對象類型定義為Observable,wasp將在后臺創(chuàng)建Observable對象并返回。
Rx是可選的,為了能夠使用,在您的依賴關系中添加反應庫。
compile 'io.reactivex:rxandroid:1.0.0'
將您的回應類型定義為Observable。
Get response as observable
service.getUser()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
18.同步請求
wasp 提供同步請求以及異步。您可能已經(jīng)自己處理后臺線程,并希望使用同步操作。
- 將響應對象定義為您的api中的返回類型,這將完成此任務
interface Service {
User getUser();
}
提供返回類型時,除了Observable和WaspRequest之外,wasp會自動使用同步操作
您調(diào)用service.getUser()時,這行將阻止線程,直到返回響應或超時為止。使用try / catch塊來處理異常。
用法
User user = service.getUser();
19.Url查詢參數(shù)
@Query用于添加查詢參數(shù)
@GET("/users/repos")
void fetchRepoBySearch(
@Query("page") int pageNumber,
@Query("sort") String sort,
Callback<Repo> callback
);
service.fetchRepoBySearch(2,"asc", callback);
//output url is ENDPOINT/users/repos?page=2&sort=asc
@QueryMap用于使用map添加查詢參數(shù)
@GET("/users/repos")
void fetchRepoBySearch(
@QueryMap Map queryParamsMap,
Callback<Repo> callback
);
Map<String,String> map = new HashMap<>();
map.put("sort","asc");
map.put("offset", "100");
service.fetchRepoBySearch(map, callback);