graphql学习(二)Restful API的初步认识

来源:互联网 发布:旅游saas平台源码 编辑:程序博客网 时间:2024/05/22 13:39

今天对GraphQL进一步的学习,本来打算看一下graphql-java源码,但是由于源码中包括了groovy和kotlin语言,这两种语言虽然听说和java像,但是毕竟还是新语言,不能很敢尝试。

graphql和restful在之前搜索资料的时候,这两种语言总是拿过来比较。为了更好地认识graphql,再加上目前对于graphq在java Web项目中究竟是怎么用的,还是一头雾水,希望通过对restful 的学习可以有进一步的认识。


这次的学习主要是基于Spring搭建RESTful web Service这个视频和网上其他的一些资料,毕竟相对于graphl,restful还是比较成熟的,网上的材料较多,但也都良莠不齐的。

这篇博客也主要是关于SpringMVC和Restful的,对于SpringMVC基础将不做介绍。


一、RESTful简介

restful在graphql出现之前是一直和webService进行比较的。两者的区别的区别这里不做讨论。
准确来说,restful不是一种类似SSH的框架,只是一种风格而已。主要是将后台和服务器进行分离。
REST通常基于使用HTTP,URI,和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。
Spring官方文档中有对于RestFul很具体的介绍和使用,可以参考https://spring.io/understanding/rest和https://spring.io/guides/gs/rest-service/这两个链接。

Principles of REST- Resources expose easily understood directory structure URIs.- Representations transfer JSON or XML to represent data objects and attributes.- Messages use HTTP methods explicitly (for example, GET, POST, PUT, and DELETE).- Stateless interactions store no client context on the server between requests. State dependencies limit and restrict scalability. The client holds session state.

在HTTP中主要是有POST,DELETE,PUT和GET四种方式(PATCH不常用)来分别指定为增删改查四种方式。
同时响应码使用的也是基于HTTP 的 状态码

1XX - informational         消息2XX - success               成功3XX - redirection           重定向4XX - client error          客户端错误5XX - server error          服务器错误

二、GraphQL和RESTful的区别

对于graphql和restful的区别,毕竟自己都是刚接触,还有很多需要学习的东西,而且就算初步使用,也是无法体会两者之间的差别;故区别这种东西还是听听前辈的。
个人感觉http://blog.csdn.net/changruihe/article/details/54630976讲的是比较好,起码看上去比较有自己的个人体会。


三、代码

在本次中,使用类似的方式之后,SpringMVC的IOC自动注入不能用了,很奇怪,就是我在测试的时候无法访问数据库了。


1、相关的包
SpringMVC的基础包之上,还需要引入Jackson相关的包。

  • jackson-annotation
  • jackson-core
  • Jackson-databind

在Spring的配置文件中需要加入一下的这一段配置信息,其他的与之前的配置信息相同,主要是将返回的数据自动封装成JSON格式的数据。但是今天测试了一下,发现不用配置下面的信息,只要是RestController就可以直接返回JSON格式的数据。(昨天测试的时候明明会报没有配置这个信息的错误,很奇怪,可能当时用的是Controller吧)

    <bean        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">        <property name="messageConverters">            <list>                <bean                    class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />                <bean                    class="org.springframework.http.converter.StringHttpMessageConverter">                    <property name="supportedMediaTypes">                        <list>                            <value>text/plain;charset=gbk</value>                        </list>                    </property>                </bean>                <bean                    class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />            </list>        </property>    </bean>

2、实体层Entity

@Entity@Table(name="user")public class User {    private int id;    private String username;    private String password;    public User(int id, String username, String password) {        this.id = id;        this.username = username;        this.password = password;    }    public User() {    }    //getter和setter...}

3、由于无法访问数据库,在这里直接自定义一些测试数据
同时,这里的Controller层主要使用的是RestController这个标签。关于RestController可以http://docs.spring.io/spring/docs/current/javadoc-api//org/springframework/web/bind/annotation/RestController.html参考这篇文档,主要就是说@RestController注解相当于@ResponseBody + @Controller合在一起的作用。此时视图解析器就不在起作用,返回的为JSON格式的数据或者XML的数据,上部分的在配置文件中配置的信息即是将返回的参数封装成JSON格式的。

@RestControllerpublic class RestController_2 {    @RequestMapping(value = "/rest_2/user/{id}", method = RequestMethod.GET)    public List<User> get(@PathVariable int id) {        System.out.println(id);        UserSerivce userSerivce = new UserServiceImpl();        List<User> user = null;        try {//          user = userSerivce.getUser(id);            for (int i = 0; i < 5; i++) {                User u = new User(i,i+"",i+"");                user.add(u);            }        } catch (Exception e) {            e.printStackTrace();        }        return user;    }}

此时启动服务器之后即可在网页中访问到返回的数据。

[  {    "id": 0,    "username": "0",    "password": "0"  },  {    "id": 0,    "username": "1",    "password": "1"  },  {    "id": 0,    "username": "2",    "password": "2"  },  {    "id": 0,    "username": "3",    "password": "3"  },  {    "id": 0,    "username": "4",    "password": "4"  }]

4、客户端,主要是使用RestTemplate 进行访问。

public class Unknown {    public static void main(String[] args) {        Unknown.test();    }    public static void test(){        RestTemplate restTemplate = new RestTemplate();        User[] users = restTemplate.getForObject("http://localhost:8080/MicroResource/rest_2/user/1", User[].class);        for (User user : users) {            System.out.println(user);        }    }}

整体实现上基本上就是这样,但是就目前情况来讲,还是不太懂restful使用的好处在哪里,就是无法自己体会到。




如果文章中有任何侵犯到您的,望告知642646522@qq.com,一定在第一时间删改。

原创粉丝点击