REST和RESTful API简介

发布时间:2023-09-25
rest是代表状态转移的缩写,它是最常用的web服务技术的几乎毫无意义的描述!rest是两个计算机系统通过http进行通信的一种方式,类似于web浏览器和服务器。
在两个或多个系统之间共享数据一直是软件开发的基本要求。例如,考虑购买汽车保险。您的保险公司必须获取有关您和您的车辆的信息,以便他们向汽车登记机构,信贷机构,银行和其他系统索取数据。所有这些实时透明地发生,以确定是否可以提供策略。
这篇颇受欢迎的文章在2020年进行了更新,以准确地解释现代rest api。
rest示例在浏览器中打开以下链接,以请求一个随机编程笑话:
https://official-joke-api.appspot.com/jokes/programming/random
这是实现为restful web服务的公共api(遵循rest约定)。您的浏览器将显示可怕的?json格式的编程笑话,例如:
[ { id: 29, type: programming, setup: there are 10 types of people in this world..., punchline: those who understand binary and those who don't } ] 您可以使用任何http客户端(例如curl)来请求相同的url并获得响应:
curl https://official-joke-api.appspot.com/jokes/programming/random http客户端库在所有流行的语言和运行时中都可用,包括javascript中的fetch和php中的file_get_contents()。json响应是机器可读的,因此可以解析并以html或任何其他格式输出。
休息与休息这些年来,各种数据通信标准都在发展。您可能会遇到包括corba,soap或xml-rpc在内的标准,这些标准通常会建立严格的消息传递规则。
rest由roy fielding于2000年定义,并且相当简单。它不是标准,而是针对restful web服务的一系列建议和约束。这些包括:
客户端服务器。systema向systemb托管的url发出http请求,该url返回响应。这与浏览器的工作方式相同。该应用程序请求一个特定的url。该请求被路由到返回html页面的web服务器。该页面可能包含对图像,样式表和javascript的引用,这些引用会导致进一步的请求和响应。无状态的。rest是无状态的:客户端请求应包含响应请求所需的所有信息。换句话说,应该可以以任何顺序发出两个或多个http请求,并且将接收到相同的响应。可缓存。应将响应定义为可缓存或不可缓存。
分层。发出请求的客户端不需要知道它是否与实际的服务器,代理或任何其他中介进行通信。创建一个restful web服务restful web服务请求包含:
端点url。实施restful api的应用程序将使用域,端口,路径和/或查询字符串(例如)定义一个或多个url端点。https://mydomain/user/123?format=jsonhttp方法。可以在映射到应用程序创建,读取,更新和删除(crud)操作的任何端点上使用不同的http方法:
http方法欺诈行动
得到 读 返回请求的数据
开机自检 创建 创建新记录
放置或修补 更新 更新现有记录
删除 删除 删除现有记录
例子:
get请求以/user/返回系统上已注册用户的列表post请求以使用主体数据创建具有id的用户/user/123123一个put请求,以用主体数据更新用户/user/123123get请求以返回用户的详细信息/user/123123删除用户的delete请求/user/123123http标头。如信息的认证令牌或cookie可以包含在http请求报头。身体数据。数据通常以与html?提交相同的方式在http正文中传输,或通过发送单个json编码的数据字符串传输。<form>
响应该响应有效载荷可以是任何实用:数据,html,图像,音频文件,依此类推。数据响应通常是json编码的,但是可以使用xml,csv,简单字符串或任何其他格式。您可以允许在请求中指定返回格式,例如或。/user/123?format=json/user/123?format=xml
还应该在响应头中设置适当的http状态代码。尽管成功也可以在创建记录时返回,但它通常用于成功的请求。错误应该返回相应的代码,比如,,,等等。200?ok201?created400?bad?request404?not?found401?unauthorized
可以设置其他http标头,包括cache-control或expires指令,以指定在响应被认为过时之前可以将响应缓存多长时间。
但是,没有严格的规则。可以根据需要实现端点url,http方法,主体数据和响应类型。例如,post,put和patch通常可以互换使用,因此任何人都可以创建或更新记录。
rest“ hello world”示例以下代码使用node.js express框架创建restful web服务。单个/hello/端点响应get请求。
确保已安装node.js,然后创建一个名为的新文件夹restapi。在该文件夹中创建一个包含以下内容的新文件:package.json
{ name: restapi, version: 1.0.0, description: rest test, scripts: { start: node ./index.js }, dependencies: { express: 4.17.1 } } 运行npm install在命令行来获取相关性,则创建一个用下面的代码文件:index.js
// simple express.js restful api 'use strict'; // initialize const port = 8888, express = require('express'), app = express(); // /hello/ get request app.get('/hello/:name?', (req, res) => res.json( { message: `hello ${req.params.name || 'world'}!` } ) ); // start server app.listen(port, () => console.log(`server started on port ${port}`); ); 使用从命令行启动应用程序,npm start然后在浏览器中打开。显示以下json以响应get请求:http://localhost:8888/hello/
{ message: hello world! } 该api还允许使用自定义名称,因此返回:http://localhost:8888/hello/everyone/
{ message: hello everyone! } 客户端rest请求和cors考虑以下在浏览器中url启动的html页面:http://localhost:8888/
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>rest test</title> </head> <body> <script> fetch('http://localhost:8888/hello/') .then((response) => { return response.json(); }) .then((json) => { console.log(json); }); </script> </body> </html> 该fetch调用发出与您期望的相同的api请求和浏览器控制台。object?{?message:?hello world!?}
但是,假设您的restful web服务现在已在域中的web上发布。页面javascript?url会相应更改,但是现在在浏览器中打开会返回控制台错误cross-origin request blocked。http://mydomain.com/hello/fetch()http://localhost:8888/
为了安全起见,浏览器仅允许客户端xmlhttprequest和fetch api调用访问托管页面的同一域。
幸运的是,跨域资源共享(cors)使我们能够规避该安全限制。设置http响应标头可告知浏览器允许该请求。可以将其设置为特定域或所有域(由上述joke api完成)。access-control-allow-origin*
因此,可以更改web服务api代码以允许从任何域上运行的任何客户端脚本进行访问:
// /h
上一个:银皇后的养殖方法和注意事项 这几点要多加注意
下一个:为什么职业货车司机,卸货时不愿意“搭把手”?

苏州废旧品回收公司在电子秤上耍花招 骗了17吨废铜废铝
自动化立体库托盘产品还需要改进很多地方
牧草施肥方法和时间 牧草追肥用什么肥为主
变频空调维修容易误判的十大问题,赶紧学习,避免犯错!
网络SEO营销之长尾关键词优化
深圳二手吊车进口报关需要了解这些!
滑动NTN轴承脂的性能分析
陕西酒糟肉的做法家常窍门 陕西酒糟肉怎么做
杏鲍菇和肉丝的新做法 杏鲍菇和肉丝的新制作方法
饺子皮的和面方法