WASP wiki

作者: mimimomo | 来源:发表于2017-03-28 16:43 被阅读15次

title: WASP WIKI

1. 主页

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

wasp一个紧凑且易于使用的“一体化”网络解决方案。


问题

谈到日常发展,您不仅需要一个库来处理网络,你需要处理模拟调用,使用多个端点,处理证书和cookie和许多其他boiler plate code。用WASP,你可以轻松处理一切。

wasp内部使用:

  1. Volley for the network stack
  2. Gson解析
  3. http堆栈的 OkHttp

wasp提供:

  • 简单的实现
  • 模拟反应通过文本文件或自动生成的模型类!
  • 请求拦截器向每个呼叫添加属性(查询参数,标题,重试策略)
  • 基于Api调用的头
  • 基于API调用的终点
  • 基于Api呼叫的重试策略
  • Cookie管理
  • 证书管理
  • 快速图像加载 (Painless Image loading)
  • RxJava支持
  • 请求取消
  • 同步请求调用
  • 异步请求调用

wasp的目标:

  • 有许多公开的问题要做出贡献。抓住这个机会去做些贡献和提高你的知识!
  • 我们想做一些有用的东西,对鼓励人们去作出贡献也是有用的!

2.证书管理

您可以通过两种方式使用此功能:

  • 信任所有证书:大多数时间测试服务器不使用由CA签署的证书。因此,在SSL握手步骤中,与这些服务器的连接失败。为了解决这个问题,您可以让Wasp接受所有证书(请注意,这只能用于测试目的,因为它使连接容易受到安全攻击。)
GitHubService service = new Wasp.Builder(this)    
  .setEndpoint("https://api.github.com")   
  .trustCertificates()  //Trust All Certificates
  .build()                        
  .create(MyService.class);

  • 证书固定:创建您的服务器证书的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.贡献

所有的贡献都非常欢迎和高度赞赏,目前有很多问题/改进等待解决,你可以基本上接受任何问题和贡献。

  • 请遵循以下规则:
  • 2空格缩进
  • Google代码约定
  • 分支全部提交
  • 添加测试

4. Cookie管理

您可以通过两种方式轻松处理Cookie:

  • 设置一个CookiePolicy,让CookieManager使用默认的CookieStore实现

  GitHubService service = new Wasp.Builder(this)    
        .setEndpoint("https://api.github.com")   
        .enableCookies(CookiePolicy.ACCEPT_ALL)     
        .build()                        
        .create(MyService.class);
  • 还提供自己的CookieStore实现,将由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用于通过添加到方法添加静态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);   

实现WaspHttpStack接口并将其传递给Wasp

9.图像处理器 Image Handler

使用wasp,您还可以下载并显示图像。wasp也为flickering提供了一个很好的解决方案。

Wasp.Image
        .from("url")
        .setDefault(R.id.image)
        .setError(R.id.image)
        .to(imageView)
        .load();

10.初始化

创建服务接口

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最强大的功能,您可以通过使用模拟注释轻松地模拟您的网络请求。

@Mock使用关于您的响应类型的自动生成功能模拟

    @Mock
    @GET("/user")
    void fetchUser(
          Callback<User> callback
    );

@Mock(path =“users.json”):使用本地文件生成模拟。本地文件必须在assets文件夹下。这将通过给定的路径返回与生成的内容的响应,状态码为200

@Mock(path="user.json")
    @GET("/user")
    void fetchUser(
          Callback<User> callback
    );

@Mock(statusCode = 404):返回状态代码为404的失败响应

@Mock(statusCode=404)
    @GET("/user")
    void fetchUser(
          Callback<User> callback
    );

@Mock(statusCode = 201):使用状态代码201和自动生成的响应返回成功

@Mock(statusCode=201)
    @GET("/user")
    void fetchUser(
         Callback<User> callback
    );

12.多个终点

您可以使用不同的端点网址进行某些网络调用,它将覆盖基本网址。

    @EndPoint("http://www.google.com")
    @GET("/users")
    void fetchUsers(
          Callback<List<User>> callback
    );

13. Proguard

如果您使用ProGuard,您应该在配置文件中添加以下选项:注意:除了这些选项之外,您还可能需要保留网络相关的模型类。


#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可以用来为请求体添加一个对象。对象将被转换为json。
@POST("/repos")
    void addName(
        @Body Repo repo,
        Callback<Repo> callback
    );

    service.addName(new Repo("3423",3),callback);
  • @BodyMap可以用来添加一个Map对象,而不是创建body类。它将被转换为json。您可以使用@BodyMap进行不想创建类的简单操作。
@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.请求拦截器

您可以拦截每个请求并添加一些其他信息。您可以实现RequestInterceptor接口或使用SimpleInterceptor类,如果您不需要实现每个功能,请使用SimpleInterceptor。

向每个请求添加headers

RequestInterceptor interceptor = new SimpleInterceptor() {
      @Override                                                
      public void onHeadersAdded(Map headers) {
          super.onHeadersAdded(headers);                       
          headers.put("key","value");                          
      }                                                        
  }

向每个请求添加其他查询参数

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.重试策略

您可以使用请求拦截器为每个调用设置重试策略

 RequestInterceptor interceptor = new SimpleInterceptor() {
      @Override
      public WaspRetryPolicy getRetryPolicy() {
          return new WaspRetryPolicy(45000, 3, 1.5f);
      }                                                      
  }

您可以使用注释为特定调用添加特定策略。如果同时使用这两个注解,则总是覆盖请求拦截器

@RetryPolicy(timeout = 10000)
    @GET("/users")
    void fetchUsers(
          Callback<List<User>> callback
    );

17.Rx支持

将响应对象类型定义为Observable,wasp将在后台创建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 提供同步请求以及异步。您可能已经自己处理后台线程,并希望使用同步操作。

  • 将响应对象定义为您的api中的返回类型,这将完成此任务
interface Service {
  User getUser();
}

提供返回类型时,除了Observable和WaspRequest之外,wasp会自动使用同步操作
您调用service.getUser()时,这行将阻止线程,直到返回响应或超时为止。使用try / catch块来处理异常。

用法

User user = service.getUser(); 

19.Url查询参数

@Query用于添加查询参数

    @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添加查询参数

 @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);

相关文章

网友评论

      本文标题:WASP wiki

      本文链接:https://www.haomeiwen.com/subject/nlnjottx.html