Py学习  »  Elasticsearch

【Elasticsearch】1. RESTful入门

华Shampoo • 2 年前 • 274 次点击  
阅读 35

【Elasticsearch】1. RESTful入门

1. REST

说到RESTful,首先要讲REST。

REST,全称为Representational State Transfer,中文翻译为表现层状态转化,是一种设计原则。

要清楚的描述REST其实还少了一个主语,REST说全了,应该是资源的表现层状态转化。英文全称为Resource Representational State Transfer。

资源(Resource):把网络中的一切事物抽象成资源,每一个资源都有一个唯一的定位标识符URL,例如一张图片,一首歌曲,一个视频,一个页面 ...

表现层(Representational):把"资源"具体呈现出来的形式,称为表现层。例如,展示一张图片,播放一首歌曲,播放一首视频,展示一个页面 ...

状态转化(State Transfer):在将"资源"呈现出来之后,用户必会对"资源"产生某种状态的操作,势必会让"资源"的状态发生变化,这个过程就叫做状态转化。

2. REST原则

  1. 使用REST的URL替换传统URL。

    传统URL一般表现为:http://localhost:9000/project/user/findOne?id=1 ,这样的URL实际上是由两个部分组成,第一个部分是URL本体:http://localhost:9000/project/user/findOne,第二个部分是该URL绑定的参数:id=1,两个部分之间使用" ?"相连。该种定位方式被认为URL和参数并不是一个整体,真正的URL:http://localhost:9000/project/user/findOne不能在网络中定义一个唯一的资源。这样就和URL原始制定的标准就有些相悖,URL在制定之初,就规定了URL中不能使用" ?"连接参数。

    REST表示的URL,整个URL必须为一个唯一的路径,且整个URL为一个整体,不可分割。使用REST表示上文的URL为:http://localhost:9000/project/user/findOne/1/

  2. 四种动词对应服务端的四种操作(CRUD,增删改查)。

    在没有REST时,我们通常使用GET和POST来前后端通信。GET和POST构建的URL映射到数据库操作可能是select,update,insert,delete。前端发起的请求只有真正到数据库执行sql的时候才知道URL对应的是CRUD中的哪一个操作,在前端表现层而言,我们是不知道对应的是CRUD中的哪一个操作。现在一般都会用具体的英文单词来构成URL,例如 /user/save,我们才能猜出来这是一个insert操作。这样的话,URL和编码的耦合度比较高。

    REST提供了四种HTTP的请求动词,代表四种请求方式:GET,POST,PUT,DELETE。REST期望前后端通信时,使用这四种动词,分别代表服务端数据库的四种操作。

    GET发出的请求对应的是insert,POST发出的请求对应的是update / insert,PUT发出的请求对应的是insert / update,DELETE发出的请求对应的是delete。

    目前主流浏览器只支持GET和POST两种HTTP通信方式,但是很多Java第三方框架(SpringMVC,SpringFlux)却支持REST接口通信,这时使用这些第三方框架搭建的系统在和浏览器通信之前,一般会使用Httpclient或者RPC客户端将REST通信方式转成浏览器可以通信的GET和POST方式,再进行通信。

  3. 服务接口返回数据的格式通常为JSON或者XML。

  4. 对于所有REST设计的接口,必须按照设计规定的方式去请求调用。例如设计的接口是PUT接口,那就必须使用PUT的方式去调用。

3. RESTful

RESTful是一种软件架构风格,如果一个架构的设计遵循REST设计原则,那么可以称该架构为RESTful架构。本系列文章所讲的Elasticsearch就是RESTful架构。

4. RESTful在SpringBoot中的实现

GET接口

@RestController
@RequestMapping("user")
public class UserController {

    @GetMapping("findOne/{id}/{username}/")
    public String findOne(@PathVariable("id") String id, @PathVariable("username") String username) {
        System.out.println("id:" + id);
        System.out.println("username:" + username);
        return "ok";
    }
}
复制代码

POST/PUT接口

和原始的表单传递方式一致。

@RestController
@RequestMapping("user")
public class UserController {

    @PutMapping("saveOne")
    public String saveOne(User user) {
        System.out.println("user:" + user);
        return "ok"


    
;
    }

    @PostMapping("updateOne")
    public String updateOne(User user) {
        System.out.println("user:" + user);
        return "ok";
    }
}
复制代码

DELETE接口

@RestController
@RequestMapping("user")
public class UserController {

    @DeleteMapping("deleteOne/{id}/")
    public String deleteOne(@PathVariable("id") String id) {
        System.out.println("id:" + id);
        return "ok";
    }
}
复制代码
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/116274
 
274 次点击