一、目录
- 实现通过POST请求进行账号注册
- 通过POST发送账号返回密码
- 了解各种注解作用和POST详情
二、实验结果和学习内容
首先因为要解析JSON数据以及返回JSON数据,因此我在选择依赖包的时候,在JSON-lib,Jackson和fastjson中选择了Jackson,那么添加依赖,这时候发现之前用的阿里云的maven仓库好像没有最新的版本,于是在下面的网站中查找,换了一个库。
添加依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
然后因为我要实现注册用户,以及返回用户密码,那么就要在Dao层和Service层进行修改,然后发现Dao层的两个方法分别是通过用户获取整个用户对象,以及直接向数据库添加用户。
然后在Service层增加函数
public String findUser(String username) {
User user = userDao.findByUsername(username);
if(user != null){
return user.getPassword();
}
return "Not Found!";
}
这样就能返回用户密码了。
然后在Controller中实现我所要实现的功能。首先是用户注册,这里我返回的一组测试数据。
@ResponseBody
@RequestMapping(value = "/trypost2", method = RequestMethod.POST)
public List<User> trypost2(@RequestBody User user){
System.out.println(user.getId()+" "+user.getPassword()+" "+user.getPassword());
List<User> list = new ArrayList<User>();
User user1 = new User();
user1.setUsername("00001111");
user1.setPassword("tttttttt");
User user2 = new User();
user2.setUsername("22221111");
user2.setPassword("pppppppp");
list.add(user1);
list.add(user2);
userServivce.Regist(user);
return list;
}
其中注解@ResponseBody
的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,而需要注意的是,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
//User字段:userName pwd
//那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
//效果等同于如下代码:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
然后可以进行测试了,因为直接使用curl比较麻烦,因此我下载了一个Postman,用于测试API。效果如下:
这是请求:
然后得到的结果:
说明返回成功了,然后看看服务器的输出:
可以看的出成果连接数据库并成功插入了数据,再看看数据库的表的变化:
产生了变化了
说明这个API是成功了的
然后是第二个API:
@ResponseBody
@RequestMapping(value = "/trypost", method = RequestMethod.POST)
public List<String> trypost(@RequestParam(value = "username") String username){
List<String> list = new ArrayList<String>();
System.out.println("login: "+username);
String pas = userServivce.findUser(username);
list.add(pas);
return list;
}
这里的@RequestParam
用于将请求参数区数据映射到功能处理方法的参数上,常用于表格。
这里我一开始也像之前一样,通过发送JSON数据来请求,但发现报错了,然后就了解到了POST四种常用数据的区别:
application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。
这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。
上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也只支持这两种方式。但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。
application/json
application/json 这个 Content-Type 作为响应头我们都不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。
这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。
text/xml
XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:
POST http://www.example.com HTTP/1.1
Content-Type: text/xml
<!--?xml version="1.0"?-->
<methodcall>
<methodname>examples.getStateName</methodname>
<params>
<param>
<value><i4>41</i4></value>
</params>
</methodcall>
XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。
然后更改了requestbody的数据类型之后,就成功了:
请求存在的用户:
结果:
不存在的用户:
而且可以看到,请求的头部是有很多数据的:
三、实验思考及感想
本次试验主要是为了App的登录和其他功能做准备,下一步应该是多用户登录的实现,具体方法还不清楚,但简单的雏形已经完成,包括新闻数据,后期还要加上Kafka消息队列来实现下拉更新的功能,我觉得需要学习的内容还有很多。