今天对GraphQL进一步的学习,本来打算看一下graphql-java源码,但是由于源码中包括了groovy和kotlin语言,这两种语言虽然听说和java像,但是毕竟还是新语言,不能很敢尝试。
graphql和restful在之前搜索资料的时候,这两种语言总是拿过来比较。为了更好地认识graphql,再加上目前对于graphq在java Web项目中究竟是怎么用的,还是一头雾水,希望通过对restful 的学习可以有进一步的认识。
这次的学习主要是基于Spring搭建RESTful web Service这个视频和网上其他的一些资料,毕竟相对于graphl,restful还是比较成熟的,网上的材料较多,但也都良莠不齐的。
这篇博客也主要是关于SpringMVC和Restful的,对于SpringMVC基础将不做介绍。
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的区别,毕竟自己都是刚接触,还有很多需要学习的东西,而且就算初步使用,也是无法体会两者之间的差别;故区别这种东西还是听听前辈的。
个人感觉http://blog.csdn.net/changruihe/article/details/54630976讲的是比较好,起码看上去比较有自己的个人体会。
在本次中,使用类似的方式之后,SpringMVC的IOC自动注入不能用了,很奇怪,就是我在测试的时候无法访问数据库了。
1、相关的包
SpringMVC的基础包之上,还需要引入Jackson相关的包。
在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],一定在第一时间删改。