3.基础请求实现

前面的内容我们建立的新项目,不知道你的新项目跑起来心情如何。

但无论心情如何,都应该确保之前的你已经搞定了,而且已经准备好迎接下边的挑战了。

准备

上篇文章的Hello World项目

PostMan软件已经安装好

1. Get请求

了解Http的同学都知道网络请求包括get/post/put/delete等等方式,如果不清楚的话可以自行补课或者参考 本部分技术补充大致了解一下。

其实要说来,我们上篇文章的Hello实验也是get请求,那么正儿八经的get是啥样子?

在HelloController里继续写一个方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 通过get请求去注册
* @param nameFromClient 用户名
* @param pswdFromClient 密码
* @return 状态信息
*/
@RequestMapping(value = "/register",method = RequestMethod.GET)
public String register(@RequestParam(value = "name") String nameFromClient,
@RequestParam(value = "pswd", required = false) String pswdFromClient){

System.out.println("姓名"+nameFromClient);
System.out.println("密码"+pswdFromClient);

if(nameFromClient.equals("surine")){
return "不允许使用此名字注册";
}else{
return "注册成功";
}
}

这块代码发上来排版不是很好看,我这里简单解释一下,首先我们创建一个register方法,通过上述代码最上面的javadoc注释我们可以知道,他接受两个参数,一个是账号,一个是密码,返回注册的状态。

对于方法内部的逻辑我是简单的写了几句,如果用户名是surine,那么就提示不允许,否则就提示注册成功,我们可以简单的使用System.out.println来打印从前端接收的字段值,来检查到底是哪里出了问题

注解方面,register方法上面的注解RequestMapping我们上面提到过,他的value主要是我们的访问路径,而他的method主要是标识我们是一个GET方法,还是一个POST方法,或者其他,默认是GET,所以你需要GET方法的时候,也可以不写这个,这也就是我上面说,上篇文章学到的也是一个Get请求的原因了。

此外我们看到方法中每个参数都有一个@RequestParam,这里我想你应该可以想到,也就是我们客户端访问时候的字段名,到后台分发处理的时候,可以对应成相应的参数,上次我们学到的getHello接口,仅仅是没有参数而已。

好了,别的不多说,我们看看运行效果,点击运行后,我们在浏览器访问:localhost:8080/register

1547707042067

是一个错误页(PS:当本页面看不出什么东西来的时候,具体的错误可以去IDE控制台看),我们可以看到最后一行,name这个参数没有,产生这个的原因是这里的@RequestParam是默认每个字段必须要有值的,比如你想实现密码可以为空,你可以这么写

1
@RequestParam(value = "pswd", required = false) String pswdFromClient

当然这里面还有很多功能,比如设置默认值,想查看有的功能,可以使用快捷键 (按住Ctrl ,单击你要查看的方法,比如这里我们是RequestParam注解,就可以进入他的定义)

那么我们正常应该怎么访问?

1
localhost:8080/register?name=surine&pswd=12345

Get请求请自行补课,我们传入了name=surine&pswd=12345,前端结果如下

1547707810805

后端控制台如下:

1547707838737

我们可以看到从前台发的东西传到后台来了,我们再来实施其他几种情况

用户名正常,密码不为空:

1547707956041

1547707976276

用户名正常,密码为空:

1547708017369

1547708033293

OK,如果你看到你期望的结果了,那么恭喜你,简单的get请求你已经会了。

2. Post请求

继续在HelloController中添加方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 通过post请求去注册
* @param nameFromClient 用户名
* @param pswdFromClient 密码
* @return 状态信息
*/
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestParam(value = "name") String nameFromClient,
@RequestParam(value = "pswd") String pswdFromClient) {

System.out.println("姓名"+nameFromClient);
System.out.println("密码"+pswdFromClient);

if(nameFromClient.equals("surine")){
return "无此用户";
}else{
return "登录成功";
}
}

实现过Get请求的你对Post请求也没什么疑问吧,实现一个Get和实现Post是一样的,唯一的不同就是RequestMapping的method被我们改成了post。

那我们运行修改后的项目,打开Postman

1547709616459

图很粗糙,凑合看吧。

第一步选择请求方法,然后填入我们的请求地址,点击Body填入相应字段和字段值,点击Send按钮,即可看到相应信息。

1547709694559

同样,我们后端收到了。

再看一下另一种情况,账号为surine

1547709738780

可以看到我们后台的逻辑生效了。

此外由于这次我们设置允许字段可以为空,所以两个字段必须全部填写。

到这里你也学会了简单的Post请求了,可能你会有个小疑问,感觉看起来Get和Post请求一样啊,都是发数据然后获取相应结果,那什么时候需要get,什么时候需要post,这个其实也算计算机网络补课内容了。

我可以简单的描述一下,比如说我们注册一个用户,简单的就是发送账号密码到后台,后台存放到 数据库,并返回注册成功与否。

再比如请求小王的QQ空间动态,是发小王账号到后台,后台根据小王的账号查询数据库获取他的动态信息返回到前台的

像前者是以发送数据存储为目的,这个我们就用post,后者主要是以获取/查询数据为目的,我们就用get,另外restful里面的put,delete等等都有具体的作用,我们可以再提。

仔细分析分析你所面临的工程,你就可以知道哪个请求用get,哪个用post了,此外像get,账号密码直接跟在链接后面是很容易看到的,不安全,而刚才我们测试的post会发现,账号密码没有跟在链接后面的,而且也需要特殊的工具才能发送post,浏览器是不行的。

经过上述分析,你可以大致理解哪样的功能需要用哪样的请求方法。

不多扯了,下面再看一个重要的实现。

3. Bean映射

bean自行补课 本部分技术补充

这里越来越接近我们最后的基础项目的样子了,我们新建立一个Package,叫Entities(实体类),并且在其中建立一个名字叫UserEntity的类。

1547710624847

然后我们赋予它几个字段

1
2
3
4
public class UserEntity {
private String userName; //姓名
private String passWord; //密码
}

然后实现他的构造和getter/setter和toString方法,实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class UserEntity {
private String userName; //姓名
private String passWord; //密码

public UserEntity(String userName, String passWord) {
this.userName = userName;
this.passWord = passWord;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getPassWord() {
return passWord;
}

public void setPassWord(String passWord) {
this.passWord = passWord;
}

@Override
public String toString() {
return "UserEntity{" +
"userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
'}';
}
}

这里千万不要手写……也不要复制我这个,你可以试试在class的大括号中按alt+insert,点击选择构造,getter,setter,或者toString各种各样的,选择之后可以生成对应字段的相应方法,或者ctrl+A全选实现全部字段的相应方法。

Idea的快捷键常用的也就那几个,多用几次就熟了。

实现之后,我们再回到我们的HelloController来看。

1
2
3
4
5
6
7
8
9
@RequestMapping(value = "/beanRegister")
public String beanRegister(UserEntity userEntity){
System.out.println(userEntity);
if(userEntity.getUserName().equals("surine")){
return "不允许注册surine";
}else {
return "注册成功";
}
}

这样看来,我们的方法变得很简洁,beanRegister方法接受UserEntity对象,返回String,RequestMapping你更是了如指掌,不必多说。

1
System.out.println(userEntity);

直接打印对象会在控制台显示他的toString内容,也就是我们刚才生成的那一堆代码里的。你一会可以检验一下。

其他内容不说了,我们一直都在用这么个逻辑……快吐了!

重新运行。

由于是个默认get请求,所以打开浏览器。

1
http://localhost:8080/beanRegister?userName=surine&passWord=123

我写了这样一个请求,结果如下

1547711372524

同理,如果我换个名字的话,

1547711409054

我们看一下后端控制台

1547711454251

两次打印的信息,可以看看是不是toString方法的内容,你也可以修改修改toString中相应的文字部分来看看。

我想你应该对Springboot有一定的理解了,好多字段,或者其他只要对应就可以访问,正如我们刚才用的url

1
http://localhost:8080/beanRegister?userName=surine&passWord=123

userName和passWord字段正是我们的UserEntity里面的两个字段,这个时候你就可以举一反三了,比如你可以改一个字段名字,改一下Url,漏写一个字段字母,在UserEntity中加一个字段……各种各样的方式,肯定是有各种各样的错误,有能出现正确结果的欢迎show me,我就不一一测试了。

当然你会问,如果我的需求是用户名不必填写,在前面的实现中我们是设置require字段来配置的,这里呢?我们可以直接把UserEntity中userName字段上面加如下注解,就可以在请求中不用发送userName字段了。

1
2
3
4
5
public class UserEntity {
@JsonIgnore
private String userName; //姓名
private String passWord; //密码
}

所以这种方法就很fashion,真正的工程,也基本上会是这样。所以我在本节开篇的地方说,越来越接近正式项目的样子了不是没有道理的。

对于Post我就不再多说了。改一下Method即可。

我实现的beanLogin方法如下,你可以先实现实现,再看我的。

1
2
3
4
5
6
7
8
9
@RequestMapping(value = "/beanLogin",method = RequestMethod.POST)
public String beanLogin(UserEntity userEntity){
System.out.println(userEntity);
if(userEntity.getUserName().equals("surine")){
return "找不到surine";
}else {
return "登录成功";
}
}

前面的文章,包括本文章介绍了两种类型的get/post请求,还有一些别的写法就不多说了,目前这两种够我们用了,下面我们说一下返回json

3.返回Json

网络通信一般使用Json或者Xml来交换数据,而最常用的还是Json,Json是什么?Json长什么样?PS:自行补课 本部分技术补充

补完之后我们继续添加一个接口

1
2
3
4
5
6
7
8
9
10
/**
* 复读机?
* @param userEntity user对象
* @return UserEntity user对象
* */
@RequestMapping(value = "/returnJson")
public UserEntity returnJson(UserEntity userEntity){
System.out.println(userEntity);
return userEntity;
}

我把他叫做复读机接口,它可以传入user对象,然后返回同样的user对象,但是到前端之后就不能叫user对象了,得叫他json……

点击项目重新运行,浏览器

1
http://localhost:8080/returnJson?userName=surine&passWord=123

嗯,下面这货这就是Json

1547712870748

对应字段和值,前端通过解析这段字符串就可以显示相应的界面,不过别着急,界面什么的都是浮云,真正的后端开发才不管什么界面不界面的。

有了正确的json就是胜利。

4.续

好像还差点啥啊?

差点啥?

Post返回Json还没写,国际惯例,小练习,需求如下

1
2
3
需求:前端Post发送UserEntity对象
后端接受之后把两个字段交换过来,如userName = surine passWord = 123 处理为 userName = 123 passWord = surine
其实就是一个get/set的过程

然后先自己实现把,结果可以自行判断是否正确

最后,我的实现如下:

1
2
3
4
5
6
7
8
9
@RequestMapping(value = "/function")
public UserEntity function(UserEntity userEntity){
String name = userEntity.getUserName();
String pswd = userEntity.getPassWord();
//交换
userEntity.setPassWord(name);
userEntity.setUserName(pswd);
return userEntity;
}

有了基础请求,相信你已经更加熟悉SpringBoot了,下面我们学习持久化部分,当掌握了持久化,你就可以直接进行项目实战了。

点我回到目录