实现通过POST请求进行注册

POST请求进行账号注册,发送账号返回密码

请注意,本文编写于 730 天前,最后修改于 730 天前,其中某些信息可能已经过时。

一、目录

  • 实现通过POST请求进行账号注册
  • 通过POST发送账号返回密码
  • 了解各种注解作用和POST详情

二、实验结果和学习内容

首先因为要解析JSON数据以及返回JSON数据,因此我在选择依赖包的时候,在JSON-lib,Jackson和fastjson中选择了Jackson,那么添加依赖,这时候发现之前用的阿里云的maven仓库好像没有最新的版本,于是在下面的网站中查找,换了一个库。

AliRepo

添加依赖:

    <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。效果如下:

这是请求:

然后得到的结果:

说明返回成功了,然后看看服务器的输出:

可以看的出成果连接数据库并成功插入了数据,再看看数据库的表的变化:

pic7.png
pic7.png

产生了变化了

说明这个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消息队列来实现下拉更新的功能,我觉得需要学习的内容还有很多。

此处评论已关闭