资讯专栏INFORMATION COLUMN

Restful 表述性状态传递

Eirunye / 1638人阅读

摘要:表述性状态传递通常基于使用,,,。使用的数据格式为方法获取数据用于更新和添加数据用于删除数据添加数据一种基于的架构方式资源与全称为表述性状态转移。客户端维护应用状态。是保存一些服务器不依赖于会话状态即可依赖的信息。

Restful
REST表述性状态传递
REST通常基于使用HTTP,URL,XML,HTML。
REST使用的数据格式为JSON

HTTP方法

GET 获取数据
PUT 用于更新和添加数据
DELETE 用于删除数据
POST 添加数据

RESTful

一种基于http的架构方式

资源与URL

REStful全称为表述性状态转移。任何事物只要有被引用的必要都为资源。资源可以为实体,可以为抽象的概念。

资源举例

用户的手机号
用户的个人信息
用户手机潜在的价值
资源要被识别,要有唯一的标识。
URL可以看成资源的地址,可以看成资源的名称。
以github举例
仓库地址 https://github.com/mySoul8012...
个人信息地址 https://github.com/mySoul8012
看URL可知仓库是在那个用户名下的

一些设计技巧

使用-或者_来进行资源的分割
使用/来表示资源的层级关系
使用?将资源进行过滤 /pulls?state=closed 表示已经关闭的推送请求,URL对应的是一种特定的查询结果。
.或者:表示同级的资源关系

统一的资源接口 幂等

指一次或者多次请求一个资源的时候,应该具有相同的副作用。属于语义化的一个词
HTTP协议是一种面向资源的应用层协议
GET用于获取资源,不应该有副作用,所以称为其幂等性,例如请求一个资源的时候,不会改变其状态,此时说明GET具有幂等性
HTTP的DELETE,会删除资源,此时具有副作用,但是多次的副作用是相同的,还是具有其幂等性
POST为创建一个资源,每次副作用都是不同的,即没有幂等性
PUT为更新资源,对于同一个URL一次和多次的是相同的,此时具有幂等性

GET

安全且幂等,表示一种获取的表示,会有缓存

POST

不安全且不幂等,使用服务器端的管理的实例号生成资源,创建子资源,用于部分更新资源,如果没有修改则不会更新资源(一种乐观锁的表示)

PUT

PUT不安全且幂等。用客户端管理的实例,创建一个资源,通过替换的方式更新资源

DELETE

不安全但是幂等

四种总结

四种tcp方式,都是不安全,因为都是明文传输,需要使用https,完成加密,防止被抓包

一些问题 一个框架 rails

官方网站 https://rubyonrails.org/
或者名为 Ruby on Rails
一种基于Ruby语言即面向对象,命令式,函数式,动态的通用编程语言,由日本科学家发明。特点是函数式编程
这是一个开源的web应用框架,严格按照MVC架构开发。

应用

Github
推特
basecamp
Groupon
yellowpages

POST和PUT

为博客增加一个Java分类,生成的路径名为/categories/java 采用PUT方法,完成更新,因为此时是由客户端决定的

客户端不一定支持HTTP方法

rails 框架是通过隐藏参数的方法,达到传递真实请求的方式

资源的表述

客户端获取的只是资源的表述。即资源的外在表现。
资源的表述包括数据和描述数据的元数据。
通过HTTP内容的协商,客户端通过头部信息达到
以github为例,JSON表述如下

一些常见的表述

URL里带上版本号
URL后缀区分表述格式

处理不支持的表述格式

资源的链接

超链接即状态引擎。
在表述格式里加入连接引导客户端。即这种链接称为流通性
以github为例

状态的转移 应用状态和资源状态

状态应该区分应用状态和资源状态。
客户端维护应用状态。
服务端维护资源状态。
客户端和服务端交互必须是无状态的。
Cookie是保存一些服务器不依赖于会话状态即可依赖的信息。

应用状态的转移

会话状态不是作为资源状态保存在服务器端的,而是被客户端作为应用状态进行跟踪的。客户端的应用在服务器端指引的超链接指引下发生变迁。
为一种架构模式

创建RESTful

创建一个JSON数据资源文件

{
    "user1": {
        "name": "mahesh",
        "password": "password",
        "profession": "teacher",
        "id": 1
    },
    "user2": {
        "name": "suresh",
        "password": "password2",
        "profession": "libraian",
        "id": 2
    },
    "user3": {
        "name": "ramesh",
        "password": "password3",
        "profession": "clerk",
        "id": 3
    },
}

即根据JSON文件有以下api

序号 Url Http方法 发送内容 结果
1 listUsers GET 显示所有用户列表
2 addUser POST JSON字符串 添加新用户
3 deleteUsers DELETE JSON字符串 删除用户
4 id GET 显示用户详细信息
获取用户列表
http://127.0.0.1:1937/listUsers
/*server.js*/
var express = require("express");    // 引入express框架
var app = express();
var fs = require("fs");     // 引入文件模块

// 创建get请求
app.get("/listUsers", (req, res) => {
    fs.readFile(__dirname + "/" + "users.json", "utf8", (err, data) => {    // 读取文件
        console.log( data );
        res.end(data);    // 将读取到的内容返回给客户端
    });
});

// 启动server
var server = app.listen(1937, () => {
    console.log(server.address());
})

查看一下JSON数据

这样暂时完成了一部分

添加用户
JSON.parse有个小坑,最后不允许使用,作为结尾
/*server.js*/
var express = require("express");    // 引入express框架
var app = express();
var fs = require("fs");     // 引入文件模块

// 添加用户的数据
var user = {
    "user4": {
        "name":"mohit",
        "password":"password4",
        "profession":"teacher",
        "id":4
    }
}

// 创建get请求
app.get("/addUser", (req, res) => {
    // 读取已存在的数据
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

        data = JSON.parse(data);    // 将传入的JSON转换为对象格式
        data["user4"] = user["user4"];    
        console.log(data);
        res.end( JSON.stringify(data) );    // 将对象转换成为JSON格式
    });
});

// 启动server
var server = app.listen(1937, () => {
    console.log(server.address());
})
{
    "user1": {
        "name": "mahesh",
        "password": "password",
        "profession": "teacher",
        "id": 1
    },
    "user2": {
        "name": "suresh",
        "password": "password2",
        "profession": "libraian",
        "id": 2
    },
    "user3": {
        "name": "ramesh",
        "password": "password3",
        "profession": "clerk",
        "id": 3
    }
}

访问 http://127.0.0.1:1937/addUser
返回的JSON数据

此时本地的JSON数据仍旧未发生改变,如果要其发生改变需要fs的写模块,将JSON数据写入JSON文件中

显示用户详情
/*server.js*/
var express = require("express");    // 引入express框架
var app = express();
var fs = require("fs");     // 引入文件模块

// 添加用户的数据
var user = {
    "user4": {
        "name":"mohit",
        "password":"password4",
        "profession":"teacher",
        "id":4
    }
}

// 创建获取用户列表路由
app.get("/listUsers", function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", "utf8", function (err, data) {
       console.log( data );
       res.end( data );
   });
})

// 创建添加用户路由请求
app.get("/addUser", (req, res) => {
    // 读取已存在的数据
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

        data = JSON.parse(data);    // 将传入的JSON转换为对象格式
        data["user4"] = user["user4"];    
        console.log(data);
        res.end( JSON.stringify(data) );    // 将对象转换成为JSON格式
    });
});

// 添加显示用户详情路由
app.get("/:id", (req, res) => {
    // 首先读取已存在的用户
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        data = JSON.parse( data );
        var user = data["user" + req.params.id]    // 获取get得到的值
        console.log( user );
        res.end( JSON.stringify(user) );
    })
})

// 启动server
var server = app.listen(1937, () => {
    console.log(server.address());
})

查看浏览器得到的JSON数据

删除用户
/*server.js*/
var express = require("express");    // 引入express框架
var app = express();
var fs = require("fs");     // 引入文件模块


// 创建获取用户列表路由
app.get("/listUsers", (req, res) => {
   fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
       console.log( data );
       res.end( data );
   });
})

// 创建添加用户路由请求
app.get("/addUser", (req, res) => {
    // 读取已存在的数据
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        if (err) {
            return console.log(err);
        };

        // 添加用户
        var user = {
        "user4": {
        "name":"mohit",
        "password":"password4",
        "profession":"teacher",
        "id":4
                }
        }

        data = JSON.parse(data);    // 将传入的JSON转换为对象格式
        data["user4"] = user["user4"];    
        console.log(data);
        res.end( JSON.stringify(data) );    // 将对象转换成为JSON格式
    });
});

// 添加显示用户详情路由
app.get("/:id", (req, res) => {
    // 首先读取已存在的用户
    fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
        data = JSON.parse( data );
        var user = data["user" + req.params.id]    // 获取get得到的值
        console.log( user );
        res.end( JSON.stringify(user) );
    })
})

var app = express();    // 不清楚为什么这里要重新定义?
// 删除用户
app.get("/deleteUser", (req, res) => {

   // 首先获取用户信息
   fs.readFile( __dirname + "/" + "users.json", "utf8", (err, data) => {
       data = JSON.parse( data );
       delete data["user" + 2];
       
       console.log( data );
       res.end( JSON.stringify(data));
   });
})

// 启动server
var server = app.listen(1937, () => {
    console.log(server.address());
})

不清楚为什么要重新定义一个类。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96400.html

相关文章

  • 那些年,我们一起误解过的REST

    摘要:通过增删查改,引起资源状态的改变,称为状态转移。用于获取资源的元信息。方法与方法类似,都可以查询资源的元信息放在的,但不会返回资源的表述。表示请求有问题,如参数错误等。表示当前请求的某前置条件不符合。网关错误,从上游服务器收到无效响应。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由sammyshen 发表于云+社区专栏 最近几年REST API越来越流行,特别是...

    DesGemini 评论0 收藏0
  • Spring Boot 2.x(十):构建优雅的RESTful接口

    摘要:满足这些约束条件和原则的应用程序或设计就是。需要注意的是,是设计风格而不是标准。同一个路径,因为请求方式的不同,而去找寻不同的接口,完成对资源状态的转变。一个符合风格的就可以称之一个的接口。 RESTful 相信在座的各位对于RESTful都是略有耳闻,那么RESTful到底是什么呢? REST(Representational State Transfer)表述性状态转移是一组架构约...

    nevermind 评论0 收藏0
  • 理解RESTful架构与json-server模拟REST api的使用

    摘要:一什么是架构即的缩写,我们把他翻译为表述性状态传递,是博士在年他的博士论文中提出来的一种软件架构风格。是个无状态的协议,所以状态就保存在服务器端。只要少量的数据就可使用,支持和。同时支持,同时提供一系列的查询方法如。 一、什么是RESTful架构? REST即Representational State Transfer的缩写,我们把他翻译为表述性状态传递,是Roy Fielding博...

    Atom 评论0 收藏0
  • SpringMVC+RestFul详细示例实战教程(实现跨域访问)

    摘要:方法和对应的方法定义定义重启服务器,运行上面的程序。五添加支持实现跨域访问当访问时,你可能需要面对同源策略问题。错误如下一般来说,在服务器端,我们在响应中返回额外的访问控制头,实现跨域链接。 一、理解 REST REST(Representational State Transfer),中文翻译叫表述性状态转移。是 Roy Thomas Fielding 在他2000年的博士论文中提出...

    U2FsdGVkX1x 评论0 收藏0
  • RESTful API 实践

    摘要:实现与它们所提供的服务是解耦的,这促进了独立的可进化性。正确的情况返回与响应码,在错误的情况下他们通常返回或。示例用于删除由标识的资源。成功删除返回及响应正文或没有正文响应。客户不存在,不合法资源命名一切在工艺软件开发的命名是成功的关键。 什么是 REST? REST 即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fie...

    dayday_up 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<