前段时间用JMessage开发了一款即时通讯软件。
但是有些遗憾的是,sdk并没有提供用户在线状态判断的方法。
只能送其它地方入手,去看了其它文档发现虽然sdk上没有可以直接调用的方法,但是提供了网络接口。只是需要自己手动去请求数据。
对于一个开发者来说,这并不是什么太大的问题。
集成网络访问框架
这里使用了Retrofit2.0,当然选择其它方式也可以。比如okhttp、xutil等都是一些非常的方便的网络请求框架。
直接在app下build.gradle文件中加入Retrofit依赖,同时引入解析工厂
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
api地址:
所有的接口地址都是基于这个根URL,为了后面拓展其它接口的请求,这里直接定义了一个全局的。
public static final String JPUSH_ROOT = "https://api.im.jpush.cn/";
定义接口:
如果想获取好友的在线状态,只需要一个用户名的参数
/*获取好友在线信息*/
@GET("/v1/users/{username}/userstat")
Call isFriendState(
@Path("username") String username);
请求数据
在请求前需要进行HTTP验证,验证方法是添加加密后的请求头
HTTP 验证
验证采用 HTTP Basic 机制,即 HTTP Header(头)里加一个字段(Key/Value对):
Authorization: Basic base64_auth_string
其中 base64_auth_string 的生成算法为:base64(appKey:masterSecret)
即,对 appKey 加上冒号,加上 masterSecret 拼装起来的字符串,再做 base64 转换。
appkey和masterSecret都需要从后台创建的项目中获取
先获取加密后的字符串
注意字符串的拼接,appKey和masterSecret中间有一个“:”英文字符的冒号。
public static String AppKey="b47a37f342eba5f9fbcd1551";
public static String masterSecret = "8a664e4e727113addc200b61";
public static String base64_auth_string = Base64Utils.getBase64(AppKey +":"+masterSecret);
然后添加请求头
这里使用拦截的方式添加请求头,如果相关接口有其它的请求头,也需要一起加上
注意:Basic后面的空格要加上
public static void headers() {
httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("Content-Type", "application/json; charset=utf-8")
.addHeader("Authorization", "Basic " + base64_auth_string)
.build();
Log.d("onrequest", "request:" + request.toString());
Log.d("onrequestHeader", "request headers:" + request.headers().toString());
return chain.proceed(request);
}
});
}
请求体
对请求的方法简单做了封装,方便统一管理
/*判断好友在线状态*/
public static void isFriendState(String userName, Callback callback){
//请求头
headers();
OkHttpClient client=httpClient.build();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(Url.JPUSH_ROOT)
.client(client)
.build();
Api aPi = retrofit.create(Api.class);
Call call = aPi.isFriendState(
userName);
call.enqueue(callback);
}
获取响应结果
在需要的地方调用方法,解析返回结果,展示到ui界面
/*获取对方在线状态*/
String state;
public void friendState(){
NetWorkManager.isFriendState(userName, new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.code()==200) {
if (response.body().online){
state = "[在线]";
}else {
state = "[离线]";
}
mTitleBarTitle.setText(userName + state);
}else {
mTitleBarTitle.setText(userName);
}
}
@Override
public void onFailure(Call call, Throwable throwable) {
}
});
}
在进行网络访问的时候有可能会出现验证失败的情况:
例如
{
error: {
message: "basic authentication failed",
code: 899008
}
}