使用SpringBoot开发一个POST接口

这篇具有很好参考价值的文章主要介绍了使用SpringBoot开发一个POST接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot项目的分层

SpringBoot框架项目一般分为五层:

  • View层:向用户展示页面

  • Controller层:前后端交互层,接收前端请求,调用Service层中的方法,接收Service层返回的数据并将其返回到前端。

  • Service层:存放业务处理的逻辑,以及一些操作数据库的接口

  • Mapper层:也可以成为DAO层,是数据库CRUD的接口,只有方法名,具体实现在mapper.xml文件中,对数据库进行数据持久化操作

  • Entity层:存放实体类,与数据库中的属性基本保持一致。

实现一个最简单的POST接口

一个最简单的POST接口,只需要在Controller层中声明一个RestController类,随后在类中使用PostMapping注解,表明这是一个POST接口,并填写相关方法即可,如下所示:

@RestController
@RequestMapping("/api")
public class CreateNumberController {
    @PostMapping("/number")
    public String createNumber(@RequestParam String param1, @RequestParam int param2) {
        // 处理POST请求的代码
        return "success";
    }
}

运行程序后,使用Postman向http://localhost:8000/api/number发送POST请求,输入相应请求参数,得到接口响应:

将接口连接事务处理逻辑函数

实际业务中的接口肯定不仅仅是如同上面的示例那么简单的一个函数,程序内部对于接收到的数据会有一定的逻辑处理。

接下来列出一个实际的业务场景:

需求

现在需要一个接口用于按照一定规则为项目赋予项目编码,项目请求内容为xml报文,例如:

<?xml version="1.0" encoding="UTF-8"?>
<name>Example Project</name>
<operate>01</operate>
<source>A</source>
<status>01</status>

当请求参数operate是1时为新增项目编码,请求参数source是A、B、C时,项目编码为Axxxx,“xxxx”为四位包含「09的10个阿拉伯数字」和「AZ的26个大写英文字母」共同组成的流水码次序为:0/1/2/3/4/5/6/7/8/9/A/B/C/D~/X/Y/Z,增加2条约束:

①第5位、第4位与第3位从000开始取值,第2位从B开始取值,即初始编码为:AB000;第5位至第2位,每一位的取值范围为「09的10个阿拉伯数字」和「AZ的24个大写英文字母(26个字母中去除I和O)」的34个字符,顺序依次为0/1/2/3/4/5/6/7/8/9/A/B/C/D~/X/Y/Z,此时“xxxx”为34进制的4位数。第5位0至Z循环一周期后即向第4位进1,第4位循环一周期后即向第3位进1,第3位循环一周期后向第2位进1。

②第2位除了I和O之外,A、C、Z也不可取,循环取值从B开始至A结束,依次为B/D…G/H/J/K…M/N/P…X/Y/0/1…9共计31个字符。

要求返回值为xml报文,形式为:

<?xml version="1.0" encoding="UTF-8"?>
<number>AB000</number>
<status>01</status>

由于暂未规定如何校验重复编码(这个需要用到数据库查询,在接下来的部分继续补充),因此可以将需求简单理解为:接收一个xml报文,按照规则生成一个编码,返回编码。

这时接口的输入和输出都是xml报文,仅仅依靠简单的Controller已经不能满足需求了,需要将输入报文进行处理拆分对应的参数,依靠Service对输入数据进行处理,使用函数生成符合要求的输出,并最终封装成xml报文返回。

POST接口接收XML报文

通常来说,在进行接口设计时思考问题是自顶向下的,即“接口可以接收并解析请求体→调用Service使用请求体中的数据运行业务逻辑→将得到的结果封装完成响应”。但实际的开发步骤是:根据需求明确请求体和响应体包括哪些属性以及这些属性的数据类型,构造请求类与响应类→新增Service类编写请求类的处理逻辑和响应类的生成逻辑→新增Controller类添加POST接口可以接收XML报文并在经过Service处理后返回XML报文。

导入相关依赖

处理xml报文需要Gradle导入jackson-dataformat-xml依赖,为保证项目的可迁移性与可复用性,放弃引入Lombok。

在Maven仓库(例如https://mvnrepository.com/)中搜索jackson-dataformat-xml依赖,选择Gradle,将下面这行复制进build.gradle的dependencies部分:

implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2'

Jackson库会自动将XML元素映射到同名的Java属性。

创建Request类和Response类

根据请求报文,在Controller文件夹中新增ProjectNumberRequest类和ProjectNumberResponse类,分别如下:

ProjectNumberRequest.java

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

public class ProjectNumberRequest {
    private String name;
    private String operate;
    private String source;
    private String status;
    
    //get方法
    public String getName() {
        return this.name;
    }
    public String getOperate() {
        return this.operate;
    }
    public String getSource() {
        return this.source;
    }
    public String getStatus() {
        return this.status;
    }
    
    //set方法
    public void setName(String projectName) {
        this.name = projectName;
    }
    public void setOperate(String projectOperate) {
        this.operate = projectOperate;
    }
    public void setSource(String projectSource) {
        this.source = projectSource;
    }
    public void setStatus(String projectStatus) {
        this.status = projectStatus;
    }
}

ProjectNumberResponse.java

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

@JacksonXmlRootElement(localName = "response")
public class ProjectNumberResponse {
    private String number;
    private String status;

    //get方法
    public String getNumber() {
        return this.number;
    }
    public String getStatus() {
        return this.status;
    }

    //set方法
    public void setNumber(String number) {
        this.number = number;
    }
    public void setStatus(String projectStatus) {
        this.status = projectStatus;
    }
}

注意:诸如@JacksonXmlRootElement(localName = "response")的注解可以将XML的根节点重命名为response,如果不添加注解则XML文件根节点名称默认使用类名。

编写业务逻辑

在Service文件夹下新增CreateNumberService类,用于处理请求报文的请求体,并按照一定规则生成项目编码和项目状态这两个属性,将其转换为XML文件,组成响应报文的响应体。

CreateNumberService包括两部分,第一部分是response对象生成函数,用于创建响应体对象,第二部分是XML对象生成函数,用于将response对象封装成XML对象。

CreateNumberService.java

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.springframework.stereotype.Service;
import studio.tsukistar.demo.Controller.ProjectNumberRequest;
import studio.tsukistar.demo.Controller.ProjectNumberResponse;

import java.util.Objects;
@Service
public class CreateNumberService {
    private static final String XML_HEAD = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
    
    public String createService(ProjectNumberRequest request) { //构建response对象
        ProjectNumberResponse response = new ProjectNumberResponse();
        response.setNumber( "AB000" );
        response.setStatus(request.getStatus());
        return javaBeanToXml (response);
    }
    
    public static String javaBeanToXml(Object obj) { //将Object转换为xml形式
        String xml= "";
        if (Objects.isNull(obj)) {
            return xml;
        }
        
        try {
            XmlMapper xmlMapper = new XmlMapper();
            xml = xmlMapper.writeValueAsString(obj);
        } catch (Exception e) {
            return "";
        }
        
        return XML_HEAD + xml;
    }
}

编写控制器

在Controller文件夹下新增CreateNumberController类,设置请求体传入类型为XML格式,返回经过CreateNumberService处理请求体后得到的响应报文。

CreateNumberController.java

import jakarta.annotation.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import studio.tsukistar.demo.Service.CreateNumberService;

@RestController
@RequestMapping("/api")
public class CreateNumberController {
    @Resource
    private CreateNumberService numberService;

    @PostMapping(value="/number", produces = MediaType.APPLICATION_XML_VALUE)
    public String createNumber(@RequestBody ProjectNumberRequest request) { // 处理POST请求的代码
        return numberService.createService(request);
    }
}

运行测试

运行程序后,使用Postman向http://localhost:8000/api/number发送POST请求,在“Body”中选择“raw-XML”,填入请求体:

<?xml version="1.0" encoding="UTF-8" ?>
<request>
    <name>测试</name>
    <operate>01</operate>
    <source>A</source>
    <status>01</status>
</request>

点击“Send”可以得到接口的响应报文,如下图所示:

总结

相较于上次,这段时间新学习了POST接口的开发方式、项目分层、各层之间的交互等内容,对SpringBoot框架也有了更深入的了解(也许?希望不要误入歧途)。代码也一并传到了github仓库中,向前迈进了一大步。

本文多数开发知识来源于Bing AI,若有错误之处请各位dalao多多赐教,不胜感激!文章来源地址https://www.toymoban.com/news/detail-712036.html

参考文章

  • Java 命名规范(非常全面)
  • SpringBoot接收和响应xml报文请求

到了这里,关于使用SpringBoot开发一个POST接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【node写接口】 通过node 快速搭建一个服务器、get请求、post请求 小白入门

    从 前后端分离开始,接口大多由后端开发,前端负责请求接口将数据渲染到页面,某些时候需要自己搭建一台服务器用于一些文件图片请求或者进行后端相关知识的学习。 node写接口篇 主要学习前端如何用node写接口 ,一边学习 一遍记录。赶紧卷起来 今天,学习使用node搭建

    2024年02月07日
    浏览(41)
  • 使用OSERDESE2原语实现多个dds合成一个波形,达到面积换速度的目的

    要实现一个高频波形的数字呈现时,可以将其拆分成4个甚至8个相同频率不同初始相位的低频波形,多个低频dds生成的波形使用OSERDESE2原语合成最终的高频波形,这样占用了更多资源,但是降低了运行速度。 如图所示彩色的波形由四个不同颜色构成,一共由36个点构成一个完

    2024年01月18日
    浏览(33)
  • SpringBoot项目使用CXF框架开发Soap通信接口

    物料准备: 1.引入cxf官方提供的SpringBootStarter依赖 2.定义需要暴雷给外部调用的java接口以及接口的实现类 3.配置CxfConfig类,把你定义的java接口注册为webservice的Endpoint 这里因为我用的springboot版本是2.4.2的,所以这里选择引入的是3.2.4版本的cxf框架,不建议引入更高的版本。 接

    2024年02月10日
    浏览(36)
  • 只需根据接口文档,就能轻松开发 get 和 post 请求的脚本,你会做吗?

      一般的接口文档描述的内容: 开发get请求的脚本,接口文档的描述如下: 在loadrunner里面创建一个空脚本: 在action空白处,点击insert—step 输入web_custom_request,双击选择该函数,填入如下几个参数值: 生成的脚本如下: 运行编译,看有没有语法错误: 在日志里面看到返回

    2024年02月05日
    浏览(61)
  • Windows下使用curl命令post请求接口

    Windows下使用curl命令请求https地址接口,能访问到接口,传参却接收不到。curl工具是下载的7.81.0-win64-mingw版本。 使用的命令为: 请求该接口方式为post,body传参,格式为json,在postman中调用接口成功,修改执行命令: 传递的json参数的双引号是需要转义的。

    2024年02月15日
    浏览(38)
  • SpringBoot初级开发--服务请求(GET/POST)所有参数的记录管理(8)

      服务端在定位错误的时候,有时候要还原现场,这就要把当时的所有入参参数都能记录下来,GET还好说,基本NGINX都会记录。但是POST的请求参数基本不会被记录,这就需要我们通过一些小技巧来记录这些参数,放入日志,这里我们通过自定义拦截器来做这个操作。 我们紧

    2024年02月09日
    浏览(41)
  • Java 中使用 OkHttpClent 请求接口 get方式 post方式

    学习记录,不喜勿喷 一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。比如可以使用http客户端与第三方服务(如SSO服务)进行集成,当然还可以爬取网上的数据等。OKHttp与HttpClient类似,也是一个Http客户端,提供了对 HTTP/2 和

    2024年02月12日
    浏览(53)
  • SpringBoot使用post方式上传文件

    file.transferTo(dest):将文件file存到dest这个文件位置。 设置header的 Content-Type为multipart/form-data 设置Body为form-data,设置key为file,点value的输入框,去选择要上传的文件

    2024年02月11日
    浏览(48)
  • C#使用post方式调用接口获取Token及调用网页地址

     IP、Port表示地址及端口,可配置或写死 public string PostDate(string IP,string Port)         {             //设置参数             string content= \\\"{\\\"userName\\\":\\\"\\\" 0000 \\\"\\\"\\\" +                  \\\",\\\"password\\\":\\\"123456\\\"}\\\";             //填充路径             string strUrl = string.Format(\\\"http://{0}:

    2023年04月08日
    浏览(35)
  • 【Golang 接口自动化02】使用标准库net/http发送Post请求

    目录 写在前面 发送Post请求 示例代码 源码分析 Post请求参数解析 响应数据解析 验证 发送Json/XMl Json请求示例代码 xml请求示例代码 总结 资料获取方法 上一篇我们介绍了使用  net/http  发送get请求,因为考虑到篇幅问题,把Post单独拎了出来,我们在这一篇一起从源码来了解一

    2024年02月14日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包