您的位置:首页 > 移动开发 > Android开发

android开发中与后台通讯中公共参数的解决方案

2015-08-21 17:55 453 查看
我们在很多项目中,跟服务器端的交互会比较多,需要调用很多的接口。

而为了保证接口的灵活性,安全性,我们通常会传一些每个接口都带的参数。比如当前app的版本号,当前系统,安全认证信息等等。

比较常见但是并不友好的方式,是把这些参数放到业务参数里,一并传给后台,比如下面这种:

public String getHomeArticle(String authorization,String article_id) throws IOException, HttpException {
String url=V_2_0_URL+"master_info";
strParams.clear();
strParams.add(new BasicNameValuePair("authorization",authorization));
strParams.add(new BasicNameValuePair("article_id",article_id));
strParams.add(new BasicNameValuePair("version_id",VERSION_ID));
strParams.add(new BasicNameValuePair("platform_type",PLATFORM_TYPE));
return baseRequest.postRequest(strParams,url);
}


上面的代码里,我们传了4个参数,分别是:安全认证信息,文章id,版本id,还有平台类型。

这四个参数中,除了文章id(article_id),剩下的3个参数,实际上跟业务逻辑没有任何关系。

而因为使用这种写法,我们不得不在每个接口都重复添加这几个参数。

我们可以改进上面的代码,在上面代码的返回值:

return baseRequest.postRequest(strParams,url);


我们修改一下postRequest方法的实现,在这个方法的开始,添加几个固定的参数:

public String postRequest(List<NameValuePair> params, String url) throws HttpException, IOException {
String result = null;
params.add(new BasicNameValuePair("version_id",VERSION_ID));
params.add(new BasicNameValuePair("platform_type",PLATFORM_TYPE));
params.add(new BasicNameValuePair("authorization",getAuthorization()));
HttpPost request = new HttpPost(url);
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
request.setEntity(entity);
......


这样看起来,貌似没有什么问题了,我们把公共的参数封装到了一个更底层的类里。

但是!这样对客户端开发人员是友好了,但是对服务器端的开发人员来说,还是一!团!糟!啊

因为他们收到的,依旧是业务参数跟普通参数混在一起的一堆。。。

当然,其实后端也可以封装一个低层的类来统一处理这些参数。

但是我们其实有另外一个方法:把这些公共参数放到request的head里面。

如下,还是postRequest方法,但是我们这样实现:

public String postRequest(List<NameValuePair> params, String url) throws HttpException, IOException {
String result = null;

HttpPost request = new HttpPost(url);
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
request.setEntity(entity);

request.addHeader(RequestParams.AppParamsKey.USER_AGENT, RequestParams.AppParams.USER_AGENT);
String token = UserManager.getInstance(mContext).getUser().getToken();
String authorization = generateAuthorization(params, token, 0, 0);
request.addHeader(RequestParams.AppParamsKey.AUTHORIZATION, authorization);


这样后端的童鞋也可以直接从head里面获取公共信息了,业务逻辑单独分开处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: