title: WASP WIKI
1. 主页
wasp一个紧凑且易于使用的“一体化”网络解决方案。
问题
谈到日常发展,您不仅需要一个库来处理网络,你需要处理模拟调用,使用多个端点,处理证书和cookie和许多其他boiler plate code。用WASP,你可以轻松处理一切。
wasp内部使用:
- Volley for the network stack
- Gson解析
- 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);