发表于: 2018-01-08 22:59:14
2 694
今天完成的事情
1.打包maven项目
用maven命令进行单元测试、打包、跳过单元测试的操作,在maven项目xml文件中添加一下代码来增加shade类进行打包:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.student.mainTest</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
这样的话就可以治接 mvn -package打可运行jar包了,并且今天还学会了小技巧运行test类,选择视图把mavenproject小窗打开,可以快速运行test打包之类的操作。
2.上传项目代码到github
没想到有一天我居然会翻墙干正经事,显示注册了github,创建了远程仓库,然后下载了sourcetree,Git,配置了小半天也没学会用sourcetree,最后放弃,转而使用idea来上传至github,最后成功上传自己的项目代码到了github
3.开始进行任务二,首先学习了REST风格
把我看的文档做的笔记放一下吧。。。有点多,师兄见谅
rest是一种软件架构的风格,中文名称:表述性状态转移
REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
表述性状态转移是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。
REST 定义了一组体系架构原则,可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。
REST定义了Web的使用标准
rest是一种设计web服务的方法,这种方法对专有中间件(例如某个应用程序服务器)的依赖比基于 SOAP 和 WSDL 的方法更少。
REST中的资源所指的不是数据,而是数据和表现形式的组合,比如"最新访问的10位会员"和"最活跃的10位会员"在数据上可能有重叠或者完全相同,而由于他们的表现形式不同,所以被归为不同的资源
资源标识符就是URI(Uniform Resource Identifier),不管是图片,Word还是视频文件,甚至只是一种虚拟的服务,也不管是XML(标准通用标记语言下的一个子集)格式、txt文件格式还是其它文件格式,全部通过 URI对资源进行唯一的标识。
对资源使用一致的命名规则(naming scheme)最主要的好处就是你不需要提出自己的规则--而是依靠某个已被定义,在全球范围中几乎完美运行,并且能被绝大多数人所理解的规则。想一下你构建的上一个应用(假设它不是采用RESTful方式构建的)中的任意一个高级对象(high-level object),那就很有可能看到许多从使用唯一标识中受益的用例。更透彻地讲:如果在一个类似于Amazon的在线商城中,没有用唯一的ID(一个URI)标识它的每一件商品,可想而知这将是多么可怕的业务决策。
但是你的浏览器如何知道需要对这个URI做些什么呢?
它知道如何去处理URI的原因在于所有的资源都支持同样的接口,一套同样的方法(只要你乐意,也可以称为操作)集合。在HTTP中这被叫做动词(verb),除了两个大家熟知的(GET和POST)之外,标准方法集合中还包含PUT、DELETE、HEAD和OPTIONS。这些方法的含义连同行为许诺都一起定义在HTTP规范之中。
由于所有资源使用了同样的接口,你可以依此使用GET方法检索一个表述(representation)--也就是对资源的描述。
REST除了给我们带来了一个崭新的架构以外,还有一个重要的贡献是在开发系统过程中的一种新的思维方式:通过url来设计系统的结构。根据REST,每个url都代表一个resource,而整个系统就是由这些resource组成的。因此,如果url是设计良好的,那么系统的结构就也应该是设计良好的。
敏捷开发所提倡的Test Driven Development,其好处之一(我觉得是最大的好处)就是可以通过testcase直观地设计系统的接口。比如在还没有创建一个class的时候就编写一个testcase,虽然设置不能通过编译,但是testcase中的方法调用可以很好地从class使用者的角度反映出需要的接口,从而为class的设计提供了直观的表现。这与在REST架构中通过url设计系统结构非常类似。虽然我们连一个功能都没有实现,但是我们可以先设计出我们认为合理的url,这些url甚至不能连接到任何page或action,但是它们直观地告诉我们:系统对用户的访问接口就应该是这样。根据这些url,我们可以很方便地设计系统的结构。
REST允许我们通过url设计系统,就像Test Driven Development允许我们使用testcase设计class接口一样。
因此人们常常会问这样一个问题:RESTful的url能覆盖所有的用户请求吗?比如,login如何RESTful?search如何RESTful?
从REST的概念上来看,所有可以被抽象为资源的东东都可以使用RESTful的url。因此对于上面的两个问题,如果login和search可以被抽象为资源,那么就可以使用RESTful的url。
一开始可能想到的是/category/ruby/articles,这种想法很直观。但是我觉得里面的category是不需要的,我们可以直接把"/ruby"理解为"category是ruby",也就是说"ruby"出现的位置说明了它指的就是category。OK,/ruby/articles,单单从这个url上看,我们能获得多少关于category的信息?显然category隐藏在了url后面,这样做到底好不好,应该是仁者见仁,智者见智了。另外还有一种url形式,它对应到程序中的继承关系。比如product是一个父类,book和computer是其子类。那么所有产品的url应该是/products,所有书籍的url应该是/books,所有电脑的url应该是/computers。这一想法就比较直观了,而且再次验证了url可以帮助我们进行设计的论点。
REST URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
就是用URL定位资源,用HTTP描述操作。
1. REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口);
2.Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心。比如:
http://api.qc.com/v1/newsfeed: 获取某人的新鲜;
http://api.qc.com/v1/friends: 获取某人的好友列表;
http://api.qc.com/v1/profile: 获取某人的详细信息;
3. 用HTTP协议里的动词来实现资源的添加,修改,删除等操作。即通过HTTP动词来实现资源的状态扭转:GET 用来获取资源,POST 用来新建资源(也可以用于更新资源),PUT 用来更新资源,DELETE 用来删除资源。比如:
DELETE http://api.qc.com/v1/friends: 删除某人的好友 (在http parameter指定好友id)
POST http://api.qc.com/v1/friends: 添加好友
UPDATE http://api.qc.com/v1/profile: 更新个人资料
4. Server和Client之间传递某资源的一个表现形式,比如用JSON,XML传输文本,或者用JPG,WebP传输图片等。当然还可以压缩HTTP传输时的数据(on-wire data compression)。
5. 用 HTTP Status Code传递Server的状态信息。比如最常用的 200 表示成功,500 表示Server内部错误等。
首先为什么要用RESTful结构呢?
大家都知道"古代"网页是前端后端融在一起的,比如之前的PHP,JSP等。在之前的桌面时代问题不大,但是近年来移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为 Web,iOS和Android提供服务。另外对于广大平台来说,比如Facebook platform,微博开放平台,微信公共平台等,它们不需要有显式的前端,只需要一套提供服务的接口,于是RESTful更是它们最好的选择。
Server的API如何设计才满足RESTful要求?
1. URL root:
https://example.org/api/v1/* 自动出来了前面的http
https://api.example.com/v1/* 同上
2. API versioning:
可以放在URL里面,也可以用HTTP的header:
/api/v1/
3. URI使用名词而不是动词,且推荐用复数。
BAD/
getProducts
/listOrders
/retrieveClientByOrder?orderId=1
GOOD
GET /products : will return the list of all products
POST /products : will add a product to the collection
GET /products/4 : will retrieve product #4
PATCH/PUT /products/4 : will update product
4. 保证 HEAD 和 GET 方法是安全的,不会对资源状态有所改变(污染)。比如严格杜绝如下情况:
GET /deleteProduct?id=1
5. 资源的地址推荐用嵌套结构。比如:GET /friends/10375923/profileUPDATE /profile/primaryAddress/city
6. 警惕返回结果的大小。如果过大,及时进行分页(pagination)或者加入限制(limit)。HTTP协议支持分页(Pagination)操作,在Header中使用 Link 即可。
7. 使用正确的HTTP Status Code表示访问状态
8. 在返回结果用明确易懂的文本(String。注意返回的错误是要给人看的,避免用 1001 这种错误信息),而且适当地加入注释。
9. 关于安全:自己的接口就用https,加上一个key做一次hash放在最后即可。考虑到国情,HTTPS在无线网络里不稳定,可以使用Application Level的加密手段把整个HTTP的payload加密。有兴趣的朋友可以用手机连上电脑的共享Wi-Fi,然后用Charles监听微信的网络请求(发照片或者刷朋友圈)。
要解释什么是REST,应该先了解API(应用程序编程接口),形象一点就是比如腾讯,新浪之类,他们提供一个API,然后我们或其他公司可以编写一个软件去跟这个接口(API)进行交互或连接。举个例子,比如可以用手机的其他软件分享内容到盆友圈或者微博,这些软件就是与微信和微博的api进行了交互。
REST是一种架构风格,或者说规则;腾讯新浪之流建立api时要遵守的一种风格、规则。
REST架构风格又涉及到web,因为REST是以web为平台的。
web 是分布式信息系统,为超文本和其他对象(资源)提供访问入口
资源是web架构的关键点,需要3个操作 识别(identity)表示(represent)交互(interact with),通过这三种操作,又引出三个概念uri(统一资源标识符包括url和urn)识别资源;representation(例如HTML,xml,图片,视频等等)表示资源;通过协议(包括http,ftp等)与资源进行交互。
REST就是选择通过使用http协议和uri,利用client/server model对资源进行crud操作。
客户-服务器(Client-Server)客户端服务器分离
REST的优点和限制(约束)
1.客户-服务器(Client-Server)客户端服务器分离
优点,提高用户界面的便携性(操作简单)
通过简化服务器提高可伸缩性(高性能,低成本)
允许组件分别优化(可以让服务端和客户端分别进行改进和优化)
2.无状态(Stateless)
从客户端的每个请求要包含服务器所需要的所有信息
优点:
提高可见性(可以单独考虑每个请求)
提高了可靠性(更容易从局部故障中修复)
提高可扩展性(降低了服务器资源使用)
3.缓存(Cachable)
服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发送请求。
优点:
减少交互次数
减少交互的平均延迟
4.分层系统(Layered System)
系统组件不需要知道与他交流组件之外的事情。封装服务,引入中间层。
优点:
限制了系统的复杂性
提高可扩展性
5.统一接口(Uniform Interface)
优点:
提高交互的可见性
鼓励单独改善组件
6.支持按需代码(Code-On-Demand 可选)
优点:提高可扩展性
这些东西,总结出来就是一句话就是,用URL定位资源,用HTTP描述操作。模模糊糊的,看的不是很了解,这里放个连接,知乎的一篇文章,讲REST讲的很好。https://zhuanlan.zhihu.com/p/30396391
4.创建了mavenWeb项目,并且将项目编译打包成了war文件,接下来就是部署tomecat了。传一下项目结构:
target目录是我打包之后生成的。
今天遇到的问题
今天在打包的时候废了很大的力气,这要归功于神奇的教程,简直和日狗。好在后来顺利解决了问题,神清气爽。然后就是sourcetree的使用了,是真不会用这个东西,什么秘钥之类的,整的人晕晕乎乎的,还是idea直接上传来的痛快。最后就是REST风格的学习了,云里雾里,似乎懂了又似乎不懂
今天的收货
以上
明天计划的事情
推进任务二,发扬拼命三郎精神,怒推任务二
最后,麻烦师兄审核。
评论