WASP wiki


title: WASP WIKI

1. 主頁

https://github.com/orhanobut/wasp/wiki

wasp一個緊湊且易于使用的“一體化”網(wǎng)絡解決方案。


問題

談到日常發(fā)展,您不僅需要一個庫來處理網(wǎng)絡,你需要處理模擬調(diào)用,使用多個端點,處理證書和cookie和許多其他boiler plate code。用WASP,你可以輕松處理一切。

wasp內(nèi)部使用:

  1. Volley for the network stack
  2. Gson解析
  3. 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);
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容