如何生成restful api生成工具文档

Restful形式接口文档生成之Swagger与SpringMVC整合手记 - zzm - ITeye技术网站
博客分类:
笔者目前正在搭建一套API服务框架,考虑到客户端能够更方便的调用API服务(这里说的更方便是指避免不厌其烦地解说各接口需要的参数和返回结 果),于是决心为每个接口生成详细的说明文档。网上搜索了一下,发现了Swagger这个东西,感觉不错,界面也比javadoc生成的页面要美观,而且 网上关于Swagger和springmvc整合的文章不少(遗憾的是大多雷同且不完整)。本文详细介绍Swagger和SpringMVC的整合过程, 重点是弥补现有文章的遗漏之处(很关键的哦!)。让我们一起来学习如何使用Swagger来生成接口文档吧!
既然是整合Swagger,那么前提是你已经使用SpringMVC搭建了一套接口服务, 无论繁简,只要可用就行。关于接口文档生成工具,大家在网上搜索的时候,可能会发现另外一个工具:springfox。网上关于springfox和 spring整合的文章也非常多的呀。那springfox和swagger是什么关系呢?引用springfox官方的语录:
Springfox has evolved from a project originally created by Marty Pitt and was named swagger-springmvc.
这段英文很简单,不懂的读者对照在线词典也可以翻译出来,加油!言归正传,先简单介绍下项目环境:
Spring 3.2.2
swagger-springmvc 1.0.2 (最新版本)
一、依赖管理
在整合之前,需要把所有使用到的依赖包全部引入。网上很多文章只是简单告诉读者引入swagger-springmvc-1.0.2.jar包,但是随后你发现这远远不够,还需要很多包,如下所示:
&!-- swagger-springmvc --&
&dependency&
&groupId&com.mangofactory&/groupId&
&artifactId&swagger-springmvc&/artifactId&
&version&1.0.2&/version&
&/dependency&
&dependency&
&groupId&com.mangofactory&/groupId&
&artifactId&swagger-models&/artifactId&
&version&1.0.2&/version&
&/dependency&
&dependency&
&groupId&com.wordnik&/groupId&
&artifactId&swagger-annotations&/artifactId&
&version&1.3.11&/version&
&/dependency&
&!-- swagger-springmvc dependencies --&
&dependency&
&groupId&com.google.guava&/groupId&
&artifactId&guava&/artifactId&
&version&15.0&/version&
&/dependency&
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-annotations&/artifactId&
&version&2.4.4&/version&
&/dependency&
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-databind&/artifactId&
&version&2.4.4&/version&
&/dependency&
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-core&/artifactId&
&version&2.4.4&/version&
&/dependency&
&dependency&
&groupId&com.fasterxml&/groupId&
&artifactId&classmate&/artifactId&
&version&1.1.0&/version&
&/dependency&
以上是比较完整的依赖列表,本文搭建的项目可以正常运行。读者可能会有疑问,maven管理的依赖包不是具有传递性吗?是的,是有传递性,但是传递性是根据&scope&来界定的。打开swagger-springmvc依赖包的可以发现,其很多依赖包的scope值为compile或者provider,不会根据传递性自动引入。
二、Swagger配置
Swagger的配置实际上就是自定义一个Config类,通过java编码的方式实现配置。代码如下:
import com.mangofactory.swagger.configuration.SpringSwaggerC
import com.mangofactory.swagger.models.dto.ApiI
import com.mangofactory.swagger.plugin.EnableS
import com.mangofactory.swagger.plugin.SwaggerSpringMvcP
import org.springframework.beans.factory.annotation.A
import org.springframework.context.annotation.B
import org.springframework.context.annotation.C
* Created by xiaohui on .
@Configuration
@EnableSwagger
public class SwaggerConfig {
private SpringSwaggerConfig springSwaggerC
* Required to autowire SpringSwaggerConfig
@Autowired
public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig)
this.springSwaggerConfig = springSwaggerC
* Every SwaggerSpringMvcPlugin bean is picked up by the swagger-mvc
* framework - allowing for multiple swagger groups i.e. same code base
* multiple swagger resource listings.
public SwaggerSpringMvcPlugin customImplementation()
return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
.apiInfo(apiInfo())
.includePatterns(".*?");
private ApiInfo apiInfo()
ApiInfo apiInfo = new ApiInfo(
"My Apps API Title",
"My Apps API Description",
"My Apps API terms of service",
"My Apps API Contact Email",
"My Apps API Licence Type",
"My Apps API License URL");
return apiI
上面这段代码是从网络上找到的,你也肯定找到了,对吧!但是,你会发现一个问题:SpringSwaggerConfig无法注入。这是为什么呢?其实很简单,因为spring容器里没有SpringSwaggerConfig类型的对象。解决办法:在springmvc的配置文件中加入以下配置即可。
&bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" /&
到目前为止,我们已经完成了对所有接口方法的扫描解析功能,那解析得到什么内容呢?这需要我们自定义,自定义操作的对象就是接口方法。先看段代码:
* 根据用户名获取用户对象
* @param name
@RequestMapping(value="/name/{name}", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "根据用户名获取用户对象", httpMethod = "GET", response = ApiResult.class, notes = "根据用户名获取用户对象")
public ApiResult getUserByName(@ApiParam(required = true, name = "name", value = "用户名") @PathVariable String name) throws Exception{
UcUser ucUser = ucUserManager.getUserByName(name);
if(ucUser != null) {
ApiResult&UcUser& result = new ApiResult&UcUser&();
result.setCode(ResultCode.SUCCESS.getCode());
result.setData(ucUser);
throw new BusinessException("根据{name=" + name + "}获取不到UcUser对象");
上述代码是Controller中的一个方法,@ApiOperation注解对这个方法进行了说明,@ApiParam注解对方法参数进行了说明。关于这两个注解的使用,可以参看源码。这样子,Swagger就可以扫描接口方法,得到我们自定义的接口说明内容。
三、Swagger-UI配置
Swagger扫描解析得到的是一个json文档,对于用户不太友好。下面介绍swagger-ui,它能够友好的展示解析得到的接口说明内容。
从 获取其所有的 dist 目录下东西放到需要集成的项目里,本文放入 src/main/webapp/WEB-INF/swagger/ 目录下。
修改swagger/index.html文件,默认是从连接http://petstore.swagger.io/v2 /swagger.json获取 API 的 JSON,这里需要将url值修改为http://{ip}:{port}/{projectName}/api-docs的形式,{}中的值根据自身情 况填写。比如我的url值为:http://localhost:8083/arrow-api/api-docs
因为swagger-ui项目都是静态资源,restful形式的拦截方法会将静态资源进行拦截处理,所以在springmvc配置文件中需要配置对静态文件的处理方式。
//所有swagger目录的访问,直接访问location指定的目录
&mvc:resources mapping="/swagger/**" location="/WEB-INF/swagger/"/&
OK!大功告成,打开浏览器直接访问swagger目录下的index.html文件,即可看到接口文档说明了。注意访问地址哦!看下图:
文章作者: 本文链接:
浏览: 973152 次
来自: 南京
用 hashmap 计数有线程问题吗?
解压出来文件不能直接覆盖\indexer\central-ct ...
米扑代理官网: / ...RESTful API 设计指南 - 阮一峰的网络日志
RESTful API 设计指南
网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......)。
因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现的设计思想。是目前比较成熟的一套互联网应用程序的API设计理论。我以前写过一篇,探讨如何理解这个概念。
今天,我将介绍RESTful API的设计细节,探讨如何设计一套合理、好用的API。我的主要参考了两篇文章(,)。
API与用户的通信协议,总是使用。
应该尽量将API部署在专用域名之下。
如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。
https://example.org/api/
三、版本(Versioning)
应该将API的版本号放入URL。
另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。采用这种做法。
四、路径(Endpoint)
路径又称"终点"(endpoint),表示API的具体网址。
在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。
举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。
/v1/animals
/v1/employees
五、HTTP动词
对于资源的具体操作类型,由HTTP动词表示。
常用的HTTP动词有下面五个(括号里是对应的SQL命令)。
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。
还有两个不常用的HTTP动词。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
下面是一些例子。
GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
六、过滤信息(Filtering)
如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
下面是一些常见的参数。
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。
七、状态码(Status Codes)
服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
状态码的完全列表参见。
八、错误处理(Error handling)
如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。
error: "Invalid API key"
九、返回结果
针对不同操作,服务器向用户返回的结果应该符合以下规范。
GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档
十、Hypermedia API
RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
比如,当用户向的根目录发出请求,会得到这样一个文档。
{"link": {
"collection /zoos",
"title": "List of zoos",
"application/vnd.yourformat+json"
上面代码表示,文档中有一个link属性,用户读取这个属性就知道下一步该调用什么API了。rel表示这个API与当前网址的关系(collection关系,并给出该collection的网址),href表示API的路径,title表示API的标题,type表示返回类型。
Hypermedia API的设计被称为。Github的API就是这种设计,访问会得到一个所有可用API的网址列表。
"current_user_url": "/user",
"authorizations_url": "/authorizations",
从上面可以看到,如果想获取当前用户的信息,应该去访问,然后就得到了下面结果。
"message": "Requires authentication",
"documentation_url": "/v3"
上面代码表示,服务器给出了提示信息,以及文档的网址。
十一、其他
(1)API的身份认证应该使用框架。
(2)服务器返回的数据格式,应该尽量使用JSON,避免使用XML。
WebSocket 是一种网络通信协议,很多高级功能都需要它。
今年三月,微软宣布 Edge 浏览器将支持 CSS 变量。
命令行是程序员的必备技能。图形界面虽然好看,解决问题还是要靠命令行。
Emoji 是可以插入文字的图形符号。& github地址:/spring-projects/spring-restdocs&Swagger
是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。github 地址:/swagger-api/swagger-core
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:54104次
排名:千里之外
原创:40篇
(4)(5)(18)(6)(5)(1)(1)(1)(1)(2)自动生成Android,iOS的REST API访问代码
发表于 日 08:00 | Hits: 3481
我们正在招聘,需要Android和iOS工程师的加入,和我一组,开发的App,为四亿职场人服务。
请发简历 到 shenfeng at kanzhun dot com,请加入我们
上个月,介绍了,后面应用到我负责的几个实际的项目,效果不错,
程序清晰了很多,也更好维护。
用类似的思路,我做了一个新的工具: api-kit,移动开发从中受益。
移动开发:Android,iOS,RESTful API
移动开发,下面几个环节免不了:
负责Server端开发的同学,写API,写文档
负责Android的同学,根据文档,以及和server端同学的交流,实现和服务器的通信代码
负责iOS的同学,根据文档,以及和server端同学的交流,实现和服务器的通信代码
这里面有一些重复: 负责server的同学开发API后,写文档是把同样的信息,表达了两次,一次是在code里面,一次在文档。
客户端同学实现各自平台的访问代码,是重复,因为这部分信息是server端的code(或者文档)的一次翻译(跨语言,跨平台)。
信息在这个过程中是无创造的复制(或者翻译,即没有引入更多的信息)
不能保证复制的正确性,比如文档错误,客户端写code引入bug,等
复制的成本较高:沟通成本,写code的成本
如果API重构,这个改动,需要在其它几个地方replay
这几天,我写了一个程序,api-kit,通过自动生成代码的方式,解决这里面的大部分重复,使信息的流动更高效和快捷。
假设API描述是这样的:
// 这是api-kit的输入,输出是各个平台的code:Android, iOS, Server端
struct Book {
string title
string isbn
float32 price
string description
@url(/books/newest)
func list&Book& getNewest(i32 limit, i32 offset);
@url(/books/search)
func list&Book& searchBook(string q, i32 limit, i32 offset);
API描述是api-kit的输入,输出是各个平台(Server,Android, iOS)的code。
生成的Server端code
IHandler interface
hook这个interface到servlet的支持代码(参数解析,绑定,dispatch)
public interface IHandler {
// Called before every function. Use cases: setup context, authentication return false to abort further execution.
public boolean before(Context context);
// Called after every function. One use case is logging
public void after(Context context);
// GET /api/books/newest
public List&Book& GetNewest(Context context, int limit, int offset);
// GET /api/books/search
public List&Book& SearchBook(Context context, String q, int limit, int offset);
服务器端的工作简化为实现这个Interface
生成的Android端code
生成的code,处理url拼接,返回值解析,暴露给程序员的是函数:
零依赖,能有效的减少apk的体积。在compiler的帮助下,做到类型安全,服务器重构后,这边会编译出错,refactor会方便一些。
生成的iOS的code
iOS显然是需要支持的。先花了一天时间,学习swift,并完成swift的code生成。在和公司的iOS工程师沟通时,他们在用objective-c,
于是又多花了一天时间看oc,并生成oc的code,语法有点不太习惯,但还是搞定了。
也是零依赖的,能有效的减少app的体积。由于oc支持类型安全的dict和arr挺困难,于是,通过注释帮助一点。
Batch,打包多个请求
由于移动的特殊性(latency),一个页面一般需要请求多次,才能render。请求多用异步,多个异步的嵌套挺不方便,
如果能合并这些请求,移动端的开发会更方便,也会提高性能。api-kit透明的实现了这一点。
ns com.kanzhun.api
struct Book {
string title
string isbn
float32 price
string description
struct NewestReq {
i32 offset
struct SearchBookReq {
i32 offset
@url(/books/newest)
func list&Book& GetNewest(NewestReq req); // batch要求参数的个数仅为一个
@url(/books/search)
func list&Book& SearchBook(SearchBookReq req);
// `batch` 为关键字
// GetNewest, SearchBook 都是函数名
// batch请求,和服务端是一次交互,客户端发送一次请求给服务端
@url(/batch)
batch Batch(GetNewest, SearchBook)
生成的code
在服务器端透明的处理掉Batch请求
在客户端生成名为Batch的函数,接受GetNewest的req,SearchBook的req,返回BatchResp
现在的状态
Android,iOS,服务端(servlet)已经完成,已测试。生成的code和手写的代码一样,高效简洁。
除去Batch,没有任何的私有协议。这里采用的是大家熟悉的HTTP,JSON,RESTful。 事实上,api-kit也可以用来生成已有的restful api的客户端code。
Batch用了一点私有协议: 请求打包,post给服务器,服务器拆开,取出一个一个的请求,挨个调用,打包每个函数的返回值,返回客户端。Batch的服务端逻辑,是自动生成的
Api的定义文件,是个很好的文档。api-kit把文档,翻译成了可以执行的代码。代码也是文档。这会节约团队之间的交流成本,
节约出来的时间,可以干更有意思的事情,比如晒晒太阳,喝喝咖啡,和奶奶聊聊天,听她讲故事。
Rest API的url endpoint是什么,对于客户端来说,变成了实现细节。客户端变成仅关心 函数名,参数,返回值,而这些,IDE会给我们很好的帮助。
整个流程简化为:定义api规范,服务器端实interface。客户端的代码已经生成好。大家思考的方式,变成函数,返回值,参数。
交流也就变为该调用哪个函数,某个参数是什么意思,参数名,函数名,在common sense的帮助下,不少也是self explained,这部分沟通也会省掉一些。
接下来的工作
可能我会想办法做到透明的cache(生成cache的code),
支持其它语言,比如生成ajax调用的js code,用于支持网站开发,Python的客户端(开发时的黑盒子测试)
生成go的服务器端代码
我们正在招聘,需要Android和iOS工程师的加入,和我一组,开发的App,为四亿职场人服务。
请发简历 到 shenfeng at kanzhun dot com,请加入我们
评价列表(0)Node.js 教程
Node.js RESTful API
什么是 REST?
REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。
表述性状态转移是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。REST 通常使用 JSON 数据格式。
以下为 REST 基本架构的四个方法:
GET - 用于获取数据。
PUT - 用于更新或添加数据。
DELETE - 用于删除数据。
POST - 用于添加数据。
RESTful Web Services
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
基于 REST 架构的 Web Services 即是 RESTful。
由于轻量级以及通过 HTTP 直接传输数据的特性,Web 服务的 RESTful 方法已经成为最常见的替代方法。可以使用各种语言(比如 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])实现客户端。RESTful Web 服务通常可以通过自动客户端或代表用户的应用程序访问。但是,这种服务的简便性让用户能够与之直接交互,使用它们的 Web 浏览器构建一个 GET URL 并读取返回的内容。
更多介绍,可以查看:
创建 RESTful
首先,创建一个 json 数据资源文件 users.json,内容如下:
"user1" : {
"name" : "mahesh",
"password" : "password1",
"profession" : "teacher",
"user2" : {
"name" : "suresh",
"password" : "password2",
"profession" : "librarian",
"user3" : {
"name" : "ramesh",
"password" : "password3",
"profession" : "clerk",
基于以上数据,我们创建以下 RESTful API:
序号URIHTTP 方法发送内容结果
1listUsersGET空显示所有用户列表
2addUserPOSTJSON 字符串添加新用户
3deleteUserDELETEJSON 字符串删除用户
4:idGET空显示用户详细信息
获取用户列表:
以下代码,我们创建了 RESTful API listUsers,用于读取用户的信息列表, server.js 文件代码如下所示:
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/listUsers', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
console.log( data );
res.end( data );
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
接下来执行以下命令:
$ node server.js
应用实例,访问地址为 http://0.0.0.0:8081
在浏览器中访问 http://127.0.0.1:8081/listUsers,结果如下所示:
"user1" : {
"name" : "mahesh",
"password" : "password1",
"profession" : "teacher",
"user2" : {
"name" : "suresh",
"password" : "password2",
"profession" : "librarian",
"user3" : {
"name" : "ramesh",
"password" : "password3",
"profession" : "clerk",
以下代码,我们创建了 RESTful API addUser, 用于添加新的用户数据,server.js 文件代码如下所示:
var express = require('express');
var app = express();
var fs = require("fs");
//添加的新用户数据
var user = {
"user4" : {
"name" : "mohit",
"password" : "password4",
"profession" : "teacher",
app.get('/addUser', function (req, res) {
// 读取已存在的数据
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
data["user4"] = user["user4"];
console.log( data );
res.end( JSON.stringify(data));
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
接下来执行以下命令:
$ node server.js
应用实例,访问地址为 http://0.0.0.0:8081
在浏览器中访问 http://127.0.0.1:8081/addUser,结果如下所示:
{ name: 'mahesh',
password: 'password1',
profession: 'teacher',
{ name: 'suresh',
password: 'password2',
profession: 'librarian',
{ name: 'ramesh',
password: 'password3',
profession: 'clerk',
{ name: 'mohit',
password: 'password4',
profession: 'teacher',
显示用户详情
以下代码,我们创建了 RESTful API :id(用户id), 用于读取指定用户的详细信息,server.js 文件代码如下所示:
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/:id', function (req, res) {
// 首先我们读取已存在的用户
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
var user = data["user" + req.params.id]
console.log( user );
res.end( JSON.stringify(user));
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
接下来执行以下命令:
$ node server.js
应用实例,访问地址为 http://0.0.0.0:8081
在浏览器中访问 http://127.0.0.1:8081/2,结果如下所示:
"name":"suresh",
"password":"password2",
"profession":"librarian",
以下代码,我们创建了 RESTful API deleteUser, 用于删除指定用户的详细信息,以下实例中,用户 id 为 2,server.js 文件代码如下所示:
var express = require('express');
var app = express();
var fs = require("fs");
var id = 2;
app.get('/deleteUser', function (req, res) {
// First read existing users.
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
delete data["user" + 2];
console.log( data );
res.end( JSON.stringify(data));
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
接下来执行以下命令:
$ node server.js
应用实例,访问地址为 http://0.0.0.0:8081
在浏览器中访问 http://127.0.0.1:8081/deleteUser,结果如下所示:
{ name: 'mahesh',
password: 'password1',
profession: 'teacher',
{ name: 'ramesh',
password: 'password3',
profession: 'clerk',
反馈内容(*必填)
截图标记颜色
联系方式(邮箱)
联系邮箱:
投稿页面:
记住登录状态
重复输入密码

我要回帖

更多关于 restful api设计文档 的文章

 

随机推荐