最近做一个项目涉及到移动部分,这里我把研究的结果给大家分享一下。由于时间仓促,水平有限,如果大家看后有任何不适请自行吃药:)
RESTFul还是JSON-RPC?
移动API设计大概就分两种RESTFul和JSON-RPC。RESTFul更多适用于对资源类的请求,JSON-RPC适用于功能性的请求。这里我主要说一下我们采用的JSON-RPC(http://www.jsonrpc.org/specification)。
JSON-RPC是一个很简单的协议,网上有很多实现,自己实现也不难。使用JSON-RPC的好处是可以统一API的接口,也就是说所有的API请求接口是一样的。
例如:
curl -X POST -H "Content-Type: application/json" --data '{ "method":"getFoo", "params":{"fooId":888}}' http://localhost/jsonrpc
curl -X POST -H "Content-Type: application/json" --data '{ "method":"createFoo", "params":{"fooId":888}}' http://localhost/jsonrpc
下面是干货
如何取得HTTP POST里的payload?
也就是curl里的--data部分的json参数。
public static String getBody(HttpServletRequest request) throws IOException {
String body = null;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
return body;
}
参见
http://stackoverflow.com/questions/14525982/getting-request-payload-from-post-request-in-java-servlet
拿到json data检查是否符合JSON-RPC 2.0的规范。然后拿到method和params去调用相应的server端service
如何认证
认证有有两种方式:token base,每次请求都把username和password放到http header中。session base,先走一个login接口,server端返回sessionid给client,client每次请求都带着这个sessionid。下面是token base的实例代码
curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic emhhbmd3OmNoYW5nZW1l" --data '{ "method":"rhhGetFoo", "params":{"fooId":888}}' http://localhost/jsonrpc
这里的"emhhbmd3OmNoYW5nZW1l"是把"zhangw:changeme"进行了Base64 encoded
String authzHeader = request.getHeader("Authorization")
if (authzHeader && authzHeader.substring(0, 6).equals("Basic ")) {
String basicAuthEncoded = authzHeader.substring(6).trim()
String basicAuthAsString = new String(basicAuthEncoded.decodeBase64())
if (basicAuthAsString.indexOf(":") > 0) {
String username = basicAuthAsString.substring(0, basicAuthAsString.indexOf(":"))
String password = basicAuthAsString.substring(basicAuthAsString.indexOf(":") + 1)
//TODO do your login here
} else {
logger.warn("For HTTP Basic Authorization got bad credentials string. Base64 encoded is [${basicAuthEncoded}] and after decoding is [${basicAuthAsString}].")
}
}
如何做版本管理
移动APP无论是client端还是server端都需要不断升级,可是如果server端的API由于升级被修改了,导致就得clien APP不能用咋办?扩展JSON-RPC,举例:
request json : {"method": "getFoo", "params":{"fooId":888}, "id": "123", "client": {"version": "v1","platform": "android/1"}}
resonpse json:{"result":[],"server":{"version": "v1", "identifier": "12afd=3uy8"}}
分享到:
相关推荐
总的来说,这个安卓期末课程设计项目涵盖了移动软件开发的多个核心领域,是提升Android开发技能和实践经验的理想实践。通过深入研究这个项目,学生可以掌握从设计到实现一个完整App的流程,并对Android开发有更全面...
C#,全称为C Sharp,是由微软公司推出的面向对象的编程语言,被广泛应用于Windows桌面应用、游戏开发、Web服务以及移动应用等多个领域。作为.NET框架的重要组成部分,C#结合了C++的强类型系统和Java的简洁性,提供了...
3. **使用案例**:除了基本用法,此资源可能还包含了一些高级特性或自定义控件的使用示例,比如SwipeRefreshLayout实现下拉刷新,NestedScrollView处理嵌套滚动等。这些案例有助于开发者解决实际项目中的问题。 4. ...
标题中的“快捷查话费,套餐的Android小应用--移动话费速查,新增联通版话费速查”是一款专为Android用户设计的应用程序,它提供了快速查询中国移动和中国联通的话费余额以及套餐使用情况的功能。这款应用的目的是...
### Unity3d心得 #### Unity3d基础知识概览 Unity3D是一款强大的跨平台游戏引擎,广泛应用于2D和3D游戏...以上是关于Unity3D的一些基础知识和心得分享,希望能够帮助初学者更快地入门并熟练掌握Unity3D的使用技巧。
这里的标签“uniapp 范文/模板/素材”暗示了压缩包可能包含了一些有用的开发资源,如预设的组件模板、示例代码或者UI设计元素。对于初学者或寻求快速开发的开发者来说,这些素材可以帮助他们节省时间,快速搭建应用...
【Android平台下的应用英语移动学习软件模块设计】 随着现代教育技术的发展,移动学习已经成为校园教育的重要组成部分,特别是在英语学习领域。Android平台凭借其广泛的使用率和开放性,成为了开发移动学习应用的...
利用Spring MVC框架实现前后端数据交互,采用RESTful风格的API设计,提高了系统的灵活性和可维护性。 结合MyBatis框架进行数据持久化操作,实现了与数据库的交互,包括课程信息、学习资料、学生信息等数据的管理和...
4. 响应式设计:随着移动设备的普及,响应式设计成为现代Web开发的必备技能。它确保网站在不同尺寸的屏幕(如手机、平板、桌面)上都能良好展示。 5. 前端框架:React、Vue.js、Angular是当前流行的前端框架,它们...
《使用Kendo UI Mobile与ASP.NET Web API构建移动应用》不仅是一本技术指南,更是实践者的心得分享。通过本书的学习,开发者不仅可以掌握具体的开发技巧,还能深刻理解如何构建高质量的移动应用。无论是初学者还是有...
在Windows API中,我们可以获取到系统菜单并通过`GetSystemMenu`函数,然后遍历菜单项,找到“移动”选项并将其移除,从而达到禁止窗体移动的目的。代码片段如下: ```cpp HMENU hMenu = GetSystemMenu(hWnd, FALSE...
本项目名为“安卓期末课程设计菜谱app”,旨在帮助大学生熟悉Android应用程序的开发流程,提供完整的源代码、使用手册以及开发过程的心得体会,为学生的课程设计提供实用资源。 首先,让我们深入探讨菜谱App的核心...
这个应用包含了完整的源代码、使用手册以及开发者的心得体会,对于学习Android移动软件开发的学生来说,这是一个宝贵的资源。以下是关于这个项目的详细知识点: 1. **Android应用程序开发基础**:首先,你需要了解...
在本项目中,我们主要探讨的是一个针对安卓平台的移动应用程序,它被设计用于帮助学生进行英语四级备考,包括提供源代码、使用手册以及开发者的心得体会。这个应用集成了多种功能,旨在提升用户的英语学习体验。以下...
### 嵌入式实验报告心得体会 #### 一、嵌入式系统概述 嵌入式系统是指一种专用的计算机系统,通常被设计用于执行特定的任务。这类系统广泛应用于汽车、家用电器、移动设备等多个领域。从广义角度来看,任何带有微...
《基于微信小程序的“C语言”移动学习平台设计与实现》 随着移动互联网技术的快速发展,微信小程序作为轻量级的应用载体,已经成为许多开发者和教育者关注的焦点。本项目旨在设计并实现一个基于微信小程序的“C语言...
从提供的文件内容来看,该文档似乎是关于Linux学习的心得体会。该文档提到了多个与Linux相关的关键概念和历史,以及Linux与Windows、Android等其他操作系统的关系。下面是根据这部分内容生成的知识点。 首先,文档...