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

今天对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=gbkvalue>
                        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格式的。

@RestController
public class RestController_2 {

    @RequestMapping(value = "/rest_2/user/{id}", method = RequestMethod.GET)
    public List get(@PathVariable int id) {
        System.out.println(id);
        UserSerivce userSerivce = new UserServiceImpl();
        List 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使用的好处在哪里,就是无法自己体会到。




如果文章中有任何侵犯到您的,望告知[email protected],一定在第一时间删改。

你可能感兴趣的:(graphql)