WASP wiki


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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容