Web Service2|学习笔记

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 快速学习 Web Service2

开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:Web Service2】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/75/detail/15840


Web Service2

 

内容介绍

一.WebService 的编译及访问

二.如何编写客户端

三.如何写 Web Service

四.Restful Web Service

五.Web Service 的使用场景

 

一.WebService 的编译及访问

Web service 开发好之后,要在配置文件里面配置一下,最重要的是它的位置在这个位置上能访问到这个 web 服务

image.png

编译完之后一定要对着这个包再去执行一次编译才能产生 WSCL 文件一定要打开这个 pom 文件,在右边一定要去编译这一个任务,编译它之后才能生成 WSCL 文件其实只有接口没有用,还有接口生成 soap 消息这个辅助类,所以要通过这个编译才能生成相应的东西

image.png

编译完之后你就可以去访问它,访问它有两种方式,一种是自己组一个信封,我们是要发一个叫 get country request 的东西,因为在这个类里面,我们看到它叫 get country request 是从 soap 里面解析内容过来的。这个里面有一个叫做 name 的东西,所以我们可以直接在这个 request 上面 get name ,把它的 name 取出来,根据这样一个映射关系,我们可以组一个这样的soap 消息。

 image.png

 postman 这样的方法去 post 一下,如图 url 是我们在这里配的,在8080端口的这个位置上等着

这个 HP request 体里面放的是个信封,这个信封就是图中所示然后你会得到一个返回的值,这个返回的值也是一个信封,这个信封也有信封体和信封头信封体,就是我们返回 get country request 里面放进去了一个我找到的这个 country ,所以返回的信封里面有一个 get country request ,这里面放了一个 country ,这 country  name population capital  currency ,这样,双方就实现了一次交互 postman 来执行的含义是说我没有写一个 Java 的代码,只要是能够发出这样请求的客户端,可以得到这样一个结果如果要写Java的代码,在客户端这边,比如我也去写spring boot 的一个工程,它要使用 web service引用这些东西如下图

image.png

它这边同样需要去产生些辅助类,所以也要用到这个运行式的东西

 image.png

这边仍然是用一个插件,这个插件名字跟上面不太一样,它的作用就生成,从 http://localhost:8080/ws/countries.wsdl 生成,前一段 service再加上“ /countries. 就能拿到这个 wsdl 。拿到它之后,这是一个 wsdl 的文,它是这种语言schemaLanguage 编写,我们说到这个位置 http://localhost:8080/ws/countries.wsdl 去拿一个 wsdl 的文件,然后去编译生成这个动作就会产生 java 这一端的端口和 provce 。

 

二.如何编写客户端

image.png

我们真正的客户端是如何编写的呢?

它说,我要继承 WebServiceGatewaySupport,这是 spring 里面写好,一旦拿到它,我们就可以去在上面进行相应的调用,比如我们定义一个叫做 getCountry 的方法, WSDL 生成之后就会有两种消息,一种是 get country request ,另一种 get country response ,我们创建一个 get country request 对象,然后设置一下,它的名字是某一个 country 然后就直接说我要得到一个country即( get country response )。

是如何得到呢?就是去执行 getWebServiceTemplate , 这个里面 spring包装好的给我们定义的一个方法它说我要去对着这个 web 服务 http://localhost:8080/ws/countries 去生成我们去发出请求,然后返回了结果之后就得到了这个 response

image.png

这个位置是如何生成的?如图,在这个位置( /ws)上,它对应的这个 countries ,这样的话就连起来了。在客户端这一端,你要想做一次调用,如果同样有一个配置,就要配 http://localhost:8080/ws” ,它默认为在哪里要创建 country ,它的 client从这里来创建在运行中也是同样的道理,你要在客户端这端先去执行 generate goal ,它才能生成客户端这端需要接口和代理,然后去执行我们是想获取西班牙的位置,它会返回“它在欧洲”。

image.png

如图为它的代码上面)。

 image.png

web service 跑起来后,可以看到 WSDL 文件的样子如图所示,这是另外一个 web service

image.png

这一边是服务器端的,定义 Endpoint,然后指定它要去通过 countryRepository 得到它想要的东西然后它要从客户端的  Getcountryrequest 消息里面去通过 get name 得到客户端想获取什么如图为服务器端跑起来的样子。

 image.png

然后看 web 服务器的客户端,我们希望得到一个 client 。我们先发送一个 get country 请求,然后对着这个位置 http://localhost:8080/ws/countries 去发,就能得到一个 response我们其实只写这几个类代码结构,但是在这个 target 生成的里面,它运行完 generate 之后会帮我们生成一系列的东西

image.png

如图,这是生成的一系列的类,是从 WSDL 文件里面生成的这个类是如何生成的我们在配置文件里面去获取客户端,然后在这个客户端里面,根据这个 WSDL 文件去生成相应的底下这些段然后我们就跑一下整个这个应用,跑了之后,这边服务器也有输出我们发了一个 SOAP 的消息过去然后服务器在解析它,产生了一个结果

image.png

然后这一边,我们想知道西班牙的位置,它返回了一个欧洲,这就是soft 服务执行的一个过程

image.png

如图为具体的代码,这是基于 spring 来写的,它封装了很多的类,我们写起来要用这些类,有很多事情可能就但是也可以什么都不用,自己写一个原生的 WebService 。

 

三.如何写 WebService

如何 WebService 呢?我这里写了一个例子如图),这是 Java 企业版定义的 inoation ,那用只要支持 webservice ,只要支持Java 企业版 webservice 的这种工具,它就能够去生成相应的 point ,这样的一些辅助

 image.png

这个 warehouse 里面,它初始化时会有一个 prices ,类似于我们在讲 RMI 的例子里面,出现过这个类现在我们把它定义成一个 webservice ,那它会有一个 getprice 方法,会暴露出去别人用就是在 webservice 里面 operation ,它有一个是来自于用户的参数,用叫做 description ,就通过网络传递那我们用 description 再到 price 这个集合类里面去找,看它应该是返回,如果有就返回它的 price 对应 price ,如果没有就返回零,底下的 main 函数是说创建一个东西,把它放到这个位置上( http://localhost:9000/Warehouse ),那用 underpoint 就是 Java 企业版自己带的接口这样一个类它里面有个 publish 方法,就把我们定义的这一个实现类发布到这个接口上,这个位置上 address,implementor ,在这个位置( address,implementor )就可以访问到它,这就是什么工具都不用,自己写一个 webservice 的样子。那就是我们刚才看到的这个Webservice ,我什么都没用,就只有一个类,这是发布一个 service 最简单的方法

image.png

那他就跑起来,这上报错因为我没有装 Log 工具,他报错

image.png

这就是我们让它跑在 LOCALHOT9000BYHO 这个地方,后面再加上 wspi 就是它生成的加了之后,它自动帮我们生成 wspi 的文件,可以看到这和刚开始讲的是一样的,它会定义一个 message getprice

有一个叫做参数的东西,放到这个getprice 里面,然后它的参数是这个返回消息是找 get price response,然后有一个put ,它是 firehouse have operation get price ,它的 include 就是我们刚才的这个消息,这是个get price消息,然后 output 就是 get price response funding 就是我们要把它绑到 SOAP 上面去,用的是 document ,具体的逻辑可以详细查询一下

我们用成本的方式,然后这个 web service 在哪里,就在我们指定的这个位置上,这就是它帮我们生成的 WSDL不是我们编辑的,是我们是生成的。这样的话,就没有用到 spring 自身的任何东西直接用 Java 的企业版就可以自动去生成这样的东西这是我们实现webservice 一个更简单的方法然后就可以去写一些前端的东西实验,客户端的写法跟上面的写法是一样的,代码本身是这样写的我们现在要讨论的是 SOAP 类型的 service 可以实现什么。我们实现了这个跨平台的这种通信,可以是一个 Java 一个 C# 之间的通信但是我们带来了一些什么问题,第一个就是我们和消息的格式是耦合起来,比如一开始讲的 make reservation ,它有四个参数,那就必须在 message 里面定义好这四个参数如果四个参数发生了变化,那 webservice使用它的客户端要跟着变第二点,我们和编码机制绑定了,比如刚才我们说它是 rpc 的还是  document, 你是跟绑定的。第三个就是我们要解析和组装 SOAP 消息,虽然这件事情不是自己做的,是靠一个工具,比如 exit 这样的工具,刚才我们引入了 coldhouse 这样的工具来做的,但是不管怎么说,它产生了组装解析和组装 SOAP 这样的工作,那即使这个工具在做,我们在执行时它有个性能上的开销然后就是我们还需要一个 WSDL 文件来描述这个 web 的一些细节,从里面还得要去生成 proxy ,所以我们在编译的时候多了要用一个编译工具去编译生成 proxy 这样的东西。虽然它确实实现了异构语言跨网络的空间,但是它带来许多问题

总的来说,这种 webservice 是一种非常耗时的方式,上面的每一样要么是系统可维护性比较差,要么是比较耗时,那么如何解决这个问题那就是用了 restful web service 。

 

四.Restful Web Service

1.Restful Web Service 的介绍

Restful Web Service 这个矢量是一个缩写,它表达的意思有几个表示是说所有的数据里,它叫表述性状态转移表示或者表述性是什么意思?就是在这种服务里都是针对数据来进行驱动或者编程的,那么数据就是客户端和服务器端,也就是在 web 服务和这个客户端之间传递的内容这个数据如何表示在客户端中,比如web service 提供一个 data ,对 A 客户是把它展示成了表,对 B 用户是展示成了饼图,具体做法会推到客户端来做,服务器端不会直接生成它的一种表示,这种表示需要客户端来做然后服务端是数据驱动的,只传数据,那么所有的数据都是资源,那每一种资源每一项数据都可以有不同的表示,它可以是表示成表或者表示饼图,这件事情靠客户端来做

那么,每一个数据要有一个唯一的标识,这个标识是指在网络上标识,所以我们有一个 URI 去描述它,体现在访问一个数据时出现在浏览器里面的那个地址里,后面要有一个唯一标识它的一个东西,比如它的ID,然后状态就指的是客户端的状态也就是说,我服务器端是不需要知道你每一个客户端都是谁,你反正任何一个人针对的某一个资源,就是某一个 URI 进行编程,我返回的数据都相同,所以服务器端是状态至于这个状态如何去展示出来,是客户端自己的事情整个程序,我们就可以理解为,就是整个客户端的状态,从一种迁移到另外一种,整个操作程序就是这样举个例子,你看到了所有的书,这是一种状态,当你要看一个细节的时候,这是一种状态,当你把它放入购物车是一种状态,那无论哪一个,在 restful web service 眼里就是你要看到所有的书,或者某一本书,或者是某一个购物车,它就只把这个数据推给你客户端如何去呈现是自己的事情所以 restful 实际上就是一种新的结构,它完全是靠数据驱动的。

2.数据驱动的好处

数据驱动有什么好处?首先我们传递的是纯数据,不是方法调用所以我给你方法调用,也就是消息的格式去交,也就是说,今天你要给我传一个购物车信息,你用的是方法 A,明天改换成方法 B这件事情对客户端不会产生任何影响,因为我本身就没有去调 A 或者 B ,我只是想知道这个购物车在哪里,比如我的 UIR 写成 local host8080,然后 cart我传进去125,这就是我的 ID (8080/cart/125),那你就应该把我的购物车返回给我,至于这个购物车是靠 A 方法得到的,还是 B 方法得到的,我不用去关心。第二,因为我们在传纯数据,这个数据通常来说是 Jason ,所以我不需要到 SOAP ,自然就没有解析和组装 SOAP 的开销,既然没有 SOAP 的开销,那也就没有 SOAP 的编码开销,直接对这个 Jason 对象传递就可以

然后,因为都是 URL 来访问,所以我不需要一个WSDL 文件来告诉我这消息的格式是什么,我应该怎么传消息然后,因为它就是 Jason 对象,所以它不需要有一个 proxy  SOAP 的消息转换成 Java 的调用,或者把 Java 返回的结果翻译成 SOAP 的消息,这些问题全部都可以解决。所以 restful 不存在这些缺陷,这个是它为什么现在使用更多的一个原因 restful 里面,我们看到每一种资源都会有一个唯一的标识,然后我们的处理过程就是在不断的转换客户端和服务器端之间的状态,那么,服务器端和客户端之间传递的消息, Jason 消息,它不需要一个 WSDL 文件再去描述它,所以它自描述了

那它就是非常适合比如去抵消掉 SOAP Service 缺陷的这种场景

3.设计原则

设计的原则是什么呢

首先要把所有的数据都抽象成资源,接着每个资源都要有唯一的标志符,然后就是要针对着 HTTP 的协议来处理因为现在我们只有 URI 表示资源,而本质上来说,我们操作一个资源就是增删改即 CRUD 的四个动作这四个动作因为我们没有在 SOAP 里面调用消息,所以你要依赖于 HTTP 协议本身来告诉我想对你的资源增删改查里面的某一种如何

那就是用 HTTP 中, GET 表示“读”, POST 表示 create ,PUT 表示update ,DELETE 表示删除第一个和第四个比较容易记间两个就记住 POST 比较长,所以它工作比较多,新增其实 ACB 协议本身就这样定义的,于是你就发现你对着同样一个 URI ,用不同的方法去访问就表示,你想新增一个元素,还是更新一个元素等等。如果是购物车,我第一次应该是 GET, 得到它购物车的状态在得不到的时候我就去 POST 一个购物车以后每一次往购物车里面放东西,我就应该用 PUT 方法给他操作,往里面去加一个东西如果购物车就是用户登出,那最后用 DELETE 把它删除掉就是这样一个逻辑 

4.例子——在星巴克喝咖啡

image.png

举一个例子,就是在星巴克喝咖啡这个动作,你分一个前台和后台,前台说用户下订单,这个订单只要没有去付账之前,他都可以做修改,但是前提是后台还没有开始做,所以你可以去修改那修改时有两种可能,一种是被拒绝,因为后台已经开始做了,比如你已经定了一杯布奇诺,你想要里面加一个 shop ,但是后台已经开始做不能更改,如果还没开始就可以更改后台做完之后,你想要拿到咖啡就要去付账,付账之后就可以把它拿走这杯咖啡被拿走后结束

后台是怎么做?后台就在一堆咖啡里面排队去找,那就找这上面单子去做,做完之后把咖啡给前台,然后再找下一个,不断的这样做

 image.png

在这个世界里面,我们重点要看 restful webservice怎么实现的。首先下订单,我们知道 create  POST  所以下订单的动作是对着 starbucks.example.org/order 这个位置上去发一个 POST 方法,那知道,你要去下一个订单然后订单里面内容是什么呢?内容可以自己去写,因为到了服务器那边,要去解析,你可以写成 Jason 的,也可以这边的 XMU ,它里面包含一个具体的订单数据,这个数据将来会在后台去解析处理无论是哪一次都要处理这个首先它就没有信封的存在,必须放到一个 soft 的消息说这是个 order ,顾客要一杯拿铁,然后客户端这个请求 POST 过来之后,星巴克这个 web 服务就去做处理,比如产生了一个订单消息,如果产生成功,返回一个消息回来,返回的 HTTP 协议里面的消息,也就是200是 OK ,201就是 create 大家比较熟悉的,比如404500,把这些返回201  creative 成功之后会告诉那个订单的位置在这

 http://starbucks.example.orq/order/1234 1234是这个订单的 ID 把它拼起来如果你要想访问这个订单应该用这样的一个 URI 。这是订单里面的内容,内容前端去处理比如下面还有一个除了拿铁,它就增加了一个 cost ,表示它的价格多少,三块钱如果想付账怎么办呢?

告诉 next next 说如果你想付账,应该对着这样一个 URI 操作 uri=http://starbucks.example.com.payment/order/1234 ,它就表示1234这个订单的付账信息应该在这儿,你对着这个地方进行操作,这就完成一次交互。

5.交互说明的问题

这个交互虽然非常简单,但是它说明了几个问题第一,它不存在 XSOAP 。第二,在传递的过程当中,只是纯数据,没有message这样的东西,也就是说,没有看见像 operation 这样的方法以及它里面的那些参数比如 parts, 没有这些东西第三,我们是纯粹靠  HTTP 协议来传递的,没有在cost SOAP ,也就不存在 SOAP 的编码,比如 rpc,document 。我们对着 order 这个位置发了一个请头过去这个请求实际上是纯粹的数据,至于这个 order 是怎么产生,写入到数据库,或者是放内存里,这事情客户端不用关心,无论是发出的数据还是返回的结果都不包含这个信息所以服务器端是用哪一个 operation 在处理这件事情,对用户来说不需要知道

image.png

这是下好了一个订单,用返回码来判断操作是否成功我们经常看500404如果看到的是201说明操作成功了

6.如何更新订单

image.png

如何更新订单?我们写的简单一点发出请求,先看一下我当前能更新,因为这个逻辑是说有可能不能进,有可能能更进取决于这个订单是否被操作。所以我们一个 options 请求出去,Options 就在说它会返回你对的这个主机加 URL 能进行什么操作它的返回值就会包括有get和put put 对应的就是 update ,说明现在我们可以更新所以我们去 put 一下,对着这个地方 starbucks.example.com 去put我要put一下,100-Continue 可以继续给我发消息,告诉我如何去 put 。当它确实返回这个消息时,我们就可以去做 PUT 那么如何做呢?

image.png

你要带这样的信息order加一点 shot 使它变浓一些。然后这边处理好了,现在这个 order 除了拿铁,还多了一个 shot ,变得更一些,价格也变贵了下一步原来是支付这个动作,也有可能正在这个过程当中,后台去处理这时请求发生了冲突,后台就会告诉你这个拿铁还是三元,没有办法去加一个 shot ,后台已经做了,就是你会得到两种不同的响应,那我们就可以根据这个客户端响应来控制前端前端应该展示什么样的页面给用户,409 conflict 表示:对不起,请求不允许

image.png

付账的时候,已经通过 next  告诉我付账应该往哪儿发所以我们先看对着这样的一个位置 OPTIONS/payment/order/1234 HTTP 1.1 能做什么,回应: GET ,PUT。

image.png

显然,这个付账的这个信息已经有了,它还是未付状态,我要给它改成已经付款状态所以就要去对着这个位置 OPTIONS/payment/order/1234 HTTP 1.1 ,去做 PUT,去做更新,可能涉及到一系列的认证的信息,把这些信息推过去推过去之后会告诉你,它会去生成 payment 然后在处理完update 之后就会你支付完的这个消息

image.png

再看后台,它想要获取所有的请求,就是所有的订单它同样对着那个 Update 去做处理,然后返回里面会说,这里面有多少内容,包含一个一个的订单有多少个。(如下图所示

 image.png

于是就拿到了所有的订单之后,它说我要开始做了,要去改写一个订单,那改写订单的时候我就要去把订单现在的状态改一下,于是,状态就变成正在处理那当时处理完之后还可以再改,变成操作完成。(下图为这一步的代码)

image.png

这就是后台拿一个订单去做处理和改变状态然后,就在检查订单,有可能成功了,或者是失败等等,基本上都是一类的

image.png

7.删除订单

最后是删除订单, Delete 方法通过这个例子,可以看到我们现在是完全数据驱动,就在解决 SOAP 这种方式带来的缺陷

8.与 SOAP 相比的优点

image.png

如果要去看如何做开发,仍然是看 spring boot 里面如何来做我们写一个 RestController,那它叫做 greeting controller ,然后它就会有一个 greeting 方法,然后我们可以看到它里面都在映射这个 greeting 路径,但是它一个是 get, 一个是 post, 这里面都会有参数,无论是 get 还是 post 过来的参数,一个参数是 name 然后如果没有传递,我就给它附一个初始值,一个叫做 WERE,一个叫做 Spring 。

不管是哪一个方法过来,我就要返回我前面这一个 template,加上这个参数拼进去以后的字符串,这是一个比较常规 controller 写法,那其实跟之前 spring  control 没有什么区别

image.png

然后 greeting 这个类,它里面就会有一个叫 content  ID ,有 GET 的方法

image.png

然后它就会因为我们在前面这写了一个,它是 rest  controller ,所以它就可以通过这样的方法去访问,你就能看到它会你什么样的东西那如果你用 get 方法访问,它会返回hello ,word”。  post 方法访问,它会返回 “hello,spring”。这就两个的差异以及支持它,那这就是我们所谓的 restful web service 。

image.png

为了去考虑这个问题,直接去展示比较方便写个 React 前端,它前端非常简单,获取它8080端口的 greeting ,然后我会得到一个响应,把这个响应转成 json ,然后提取里面的内容 Data 提取 data 把它转出来之后把它替换掉,提交我们这个 H 1标签里的英语 test, 然后在 council 里面会写相应的动作。

 image.png

就是web service,我们跑一下。

image.png

然后这边是客户端客户端写了一个 controller 的东西,这个 react 的东西要对着这个地方 http://localhost:8080/greeting 去访问,就这样一个东西

这个 ra 跑起来就返回了这个结果

 id:1,content:Hello,World! ,但是这里面有一个小坑就是现在我写成两个工程了,所以是跨域的问题现在要讲的就是跨域的问题,在后台,在 spring 里面可以这么做,就是你允许哪一些跨域的操作。如果是按这个里面的写法,就是你允许所的来自于跨域的用性和都可以来访问,于是我们现在虽然是两个工程,而这两个工程起来以后端口号不一样,这个在3000,这个在8000,虽然都在 local host 但是它们两个的端口不一样,所以存在跨域问题但是因为我允许所有的脚本的这个模式出现,所以现在我们看到的它就是解决了一个跨越的问题,要靠这种方式解决跨域所以这里有个小坑就可以解决跨域

从这个例子可以看到实现restful web service 反而很简单,如果用 spring  的这个写法的话,就直接是一个 restful 的一个 controller, 它就能实现这样的动作在这里面要注意的是,Restful   controller,它默认情况下,在这里返回一个 greeting 对象,这个对象会被转成 Jason 返回所以,尽管这里是一个 Java 类型的对象,Greating,它也会被自动转成一个 Jason 返回

这就是为什么在前台我们得到的东西是一个 Jason的原因是有关跨域的定义的那我们实际上是允许了所有的都可来访问我方法,所以我们跨域成功,当然,跨域有前台的解决方法,也有后台解决方法现在是在后台来支持所有跨域操作,知道了 web service 之后,我们可以看到 web service好处

9.SOAP 和 restful web service 的优缺点

image.png

它好处主要来说是跨平台,也是异构系统交互,缺点主要是生产率比较低就是,无论是数据驱动的 restful 还是 SOAP 生产率都比较低。 restful 涉及到数据的解析问题,就是仍然还要对数据进行解析,它不如直接跟一个接口绑定一样效率那么高但是我们要在效率和代码可维护性之间做平衡,所以我们认为 restful 还是可以的。

 

五.Web Service 的使用场景

那关键的问题就是,什么时候应该用 web service 什么时候不应该用比如有异构系统集成的这种需求跨越防火墙甚至要做远距离的异构系统时候,应该考虑用 web service 。那什么时候不太应该用?比如单机系统肯定没有必要,因为要走 HTTP 协议,这个协议不算一个高效协议,跟我们之前讲的 RMI 或者是 GMS 相比,它的效率明显要低然后在同构的应用里也不需要,尤其在一个局域网内之间程序之间,没有必要用 web service 。虽然 web service 能解决很多问题,但关键的问题要学会取舍,知道什么时候要使用。在这里面要强调一点在开发 web service的时候,如果是在原来的系统上增加功能,就像我提要求,比如要把下订单的功能封装成一个 web service, 其实不需要重新写任何东西,你是在现有的基础上去做封装,它的道理就是实际上你已经有这个接口和时间类,只需要把一层封装出来当然前提是,这是个 SOAP 消息,如果是一个 restful 的消息,改造起来可能更简单也就是说,如果你原来用的是 spring ,把原来的 controller 转成 restful controller 就可以了,而唯一带来的一个变化就是它返回的东西是 Jason 。

尽管写的是一个类或者其他的东西,无论怎样,它一定会一个 Jason 。所以,你在前端要稍微改一下,要说这是一个 Jason 对象,拿来之后要怎么进行处理,其他的没有什么更复杂的地方。

按道理,如果你做的是一个功能齐全的电子书,那么现在要求你做的 web service 作业,不需要做大改动,只原来的基础上做一些小修改,做一些扩展就可以了。如果是用 spring 的,要把 controller restful controller在前端改成返回的是 Jason ,要Jason 进行处理

如果用的是其他的,想 SOAP 方式来暴露的话,你只要多加一个 SOAP 上面多去编译一次,生成 WSDL 就可以了,其他的不需要做大的更改而且支持 service 的后端,你可以用coldhouse,其实还有别的常用的,像 Axis 也可以不是唯一的,只要能实现就行。

相关文章
|
1月前
|
计算机视觉 Python
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
这篇文章是关于如何使用Flask框架结合OpenCV库,通过电脑摄像头实现视频流在网页上的实时显示,并提供了单摄像头和多摄像头的实现方法。
86 2
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
|
1月前
|
文件存储 Python
Flask学习笔记(一):Flask Web框架
本文介绍了Flask Web框架的基本概念、安装方法、初始化参数、程序编写、静态文件显示和配置信息加载等基础知识。
25 0
|
6月前
|
JavaScript
web学习笔记(二十)
web学习笔记(二十)
33 0
|
4月前
|
自然语言处理 运维 JavaScript
web-flash 学习笔记
web-flash 学习笔记
|
6月前
|
JavaScript 前端开发 API
web学习笔记(二十九)jQuery
web学习笔记(二十九)jQuery
39 0
|
6月前
|
存储 JSON JavaScript
web学习笔记(二十八)
web学习笔记(二十八)
42 0
|
6月前
web学习笔记(二十七)PC端网页特效
web学习笔记(二十七)PC端网页特效
35 0
|
6月前
|
JavaScript 前端开发 Go
web学习笔记(二十六)
web学习笔记(二十六)
39 0
|
6月前
|
JavaScript 前端开发 内存技术
web学习笔记(二十五)BOM开始
web学习笔记(二十五)BOM开始
42 0
|
6月前
|
JavaScript
web学习笔记(二十四)
web学习笔记(二十四)
36 0