假期别闲着:REST API实战演练之创建Rest API
1、创建实体类,模拟实体对象
创建一个类,模拟数据数据库来存储数据,这个类就叫Person。

其代码如下:
package com.restful;public class Person {private String name;private String about;private int birthYear;public Person(String name, String about, int birthYear) {this.name = name;this.about = about;this.birthYear = birthYear;}public String getName() {return name;}public String getAbout() {return about;}public int getBirthYear() {return birthYear;}
}
2、创建数据类,模型数据库存储
再创建一个类,假设能够访问我们的数据库,类名字就叫DataStore。

编写如下代码:
package com.restful;import java.util.HashMap;
import java.util.Map;public class DataStore {//Map of names to Person instances.private Map<String, Person> personMap = new HashMap<>();//this class is a singleton and should not be instantiated directly!private static DataStore instance = new DataStore();public static DataStore getInstance(){return instance;}//private constructor so people know to use the getInstance() function insteadprivate DataStore(){//dummy datapersonMap.put("Ada", new Person("Ada", "Ada Lovelace was the first programmer.", 1815));personMap.put("Kevin", new Person("Kevin", "Kevin is the author of HappyCoding.io.", 1986));personMap.put("Stanley", new Person("Stanley", "Stanley is Kevin's cat.", 2007));}public Person getPerson(String name) {return personMap.get(name);}public void putPerson(Person person) {personMap.put(person.getName(), person);}
}
3、创建Servlet,接收请求并访问数据对象
接下来,我们创建一个Servlet类,类名就叫做PersonServlet。


修改代码如下:
package com.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;import com.restful.DataStore;
import com.restful.Person;
/*** Servlet implementation class PersonServlet*/
@WebServlet("/PersonServlet")
public class PersonServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public PersonServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubString requestUrl = request.getRequestURI();String name = requestUrl.substring(requestUrl.lastIndexOf("/")+1);System.out.println(name);Person person = DataStore.getInstance().getPerson(name);if(person != null){String json = "{\n";json += "\"name\": " +"\""+ person.getName() +"\""+ ",\n";json += "\"about\": " + "\""+ person.getAbout() + "\""+",\n";json += "\"birthYear\": " + "\""+ person.getBirthYear() + "\""+"\n";json += "}";response.getOutputStream().println(json);}else{//That person wasn't found, so return an empty JSON object. We could also return an error.response.getOutputStream().println("{}");}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubString name = request.getParameter("name");String about = request.getParameter("about");int birthYear = Integer.parseInt(request.getParameter("birthYear"));DataStore.getInstance().putPerson(new Person(name, about, birthYear));}}
上述创建的Servlet类包含了doGet函数和doPost函数。
4、配置一个Servlet映射
创建servlet后,我们修改一下我们的web.xml,做一个映射,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"><display-name>HelloJSP</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.jsp</welcome-file><welcome-file>default.htm</welcome-file></welcome-file-list><servlet><servlet-name>PersonServlet</servlet-name><servlet-class>com.servlet.PersonServlet</servlet-class></servlet><servlet-mapping><servlet-name>PersonServlet</servlet-name><url-pattern>/people/*</url-pattern></servlet-mapping></web-app>
doGet()函数从 URL 中获取一个人的姓名,然后使用DataStore类来获取那个人。接着它从该人的数据中创建一个 JSON 字符串,并将该 JSON 作为对请求的响应返回GET。请记住,JSON 使用用引号括起来的键和值,如下所示:
{
"name": "Ada",
"about": "Ada Lovelace was the first programmer.",
"birthYear": 1815
}
5、测试
接下来我们启动服务加载该servlet,在浏览器输入如下地址:localhost:8080/HelloJSP/people/Kevin
结果显示如下:

今天就先把怎么写一个简单的rest api介绍到这儿,后面说一下客户端怎么使用rest api访问数据。
参考资料:https://blog.csdn.net/allway2/article/details/123375541
https://happycoding.io/tutorials/java-server/rest-api
相关文章:
假期别闲着:REST API实战演练之创建Rest API
1、创建实体类,模拟实体对象 创建一个类,模拟数据数据库来存储数据,这个类就叫Person。 其代码如下: package com.restful;public class Person {private String name;private String about;private int birthYear;public Perso…...
C++模仿qq界面
#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口的大小this->resize(645,497);//设置窗口名字this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\zhouzhouMyfile\\qt_proj…...
3D模型在线轻量化工具
在计算机图形学领域,3D模型简化工具是一种强大的工具,用于减少模型的面数,以提高模型在渲染和处理过程中的性能。本文将全面介绍为何需要简化模型、简化的方法、常见的简化算法以及一款三维模型优化产品 的使用方法,帮助读者更好地…...
去中心化社交媒体:分析 Facebook 在区块链平台上的角色
在当今数字时代,社交媒体已经成为人们日常生活中不可或缺的一部分。然而,随着人们对数据隐私和信息控制的关注不断增加,传统的中心化社交媒体平台也面临着越来越多的质疑和挑战。为了应对这些挑战,越来越多的人开始探索去中心化社…...
实现多租户JAVA支付(微信拉起支付):一个简单而强大的解决方案
简介: 本篇文章为多租户场景 在当今数字经济时代,许多企业都面临着处理多租户支付的挑战。多租户系统是指一种架构,其中单个实例的软件服务多个租户,每个租户的数据通常被隔离,以确保安全性和数据隐私。而在这种环境…...
万字长文:FineBI面试题及参考答案详解
1:FineBI的基本概念是什么? FineBI是帆软软件有限公司推出的一款商业智能产品。它的核心功能是通过分析企业已有的信息化数据,帮助企业发现并解决存在的问题,预测模拟企业将来的发展,并协助企业及时调整策略做出更好的决策,增强企业的可持续竞争性。 2:描述FineBI的使…...
Python爬虫:为什么你爬取不到网页数据
目录 前言 一、网络请求被拒绝 二、数据是通过JavaScript加载的 三、需要进行登录 四、网站反爬虫策略 五、网站结构变更 总结 前言 作为一名开发者,使用Python编写爬虫程序是一项常见的任务。爬虫程序的目的是收集互联网上的数据,并将其保存或使…...
NLP在搜索召回领域中的应用场景
自然语言处理(NLP)在搜索召回领域中的应用场景非常广泛,它通过理解和分析人类语言,提高了信息检索的准确性和效率。以下是一些具体的应用场景: 1. 搜索引擎优化 NLP技术可以用于优化搜索引擎的查询处理,通…...
2. Django配置信息
第2章 Django配置信息 Django的配置文件settings.py用于配置整个网站的环境和功能, 核心配置必须有项目路径, 密钥配置, 域名访问权限, App列表, 中间件, 资源文件, 模板配置, 数据库的连接方式.* 项目运行时, 如果修改代码, 项目会自动检测发现改动后会重新运行, 除非报错否…...
【Web】纯萌新的BUUCTF刷题日记Day1
目录 [RoarCTF 2019]Easy Java [网鼎杯 2018]Fakebook [CISCN2019 华北赛区 Day2 Web1]Hack World [BJDCTF2020]The mystery of ip [网鼎杯 2020 朱雀组]phpweb [BSidesCF 2020]Had a bad day [BJDCTF2020]ZJCTF,不过如此 [BUUCTF 2018]Online Tool [GXYCTF…...
【51单片机入门记录】RTC(实时时钟)-DS1302概述
目录 一、基于三线通信的RTC-DS1302 (1)简介 (2)特性 (3)引脚介绍 (4)控制字的格式 (5.0)日历时钟寄存器介绍 (5.1)日历时钟寄存…...
Lua热更新(AssetBundle)
AssetBundle 新版本导入ab包报错,则删除其中的Tests文件夹。 给资源分组 打包设置:平台、路径、重复打包清空文件夹、复制到streaming文件夹 建议勾选 建议使用LZ4压缩方式 用来观察文件中的包大小,不常用 参数总结: 这六个只做了解,重要的是上面的...
互联网人才现状分析
作者:哈哥撩编程(视频号、抖音、公众号同名) 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 🏆 推荐专栏: 🏅…...
高级IO——多路转接
高级IO——五种IO模型 首先我们之前在基础IO部分就学过IO的过程分等待过程和读写过程! 比如我们的scanf除了从键盘缓冲区读取数据所花的时间,主要的时间花费放在了等你输入的过程! 所以我们如果想提高我们的IO效率,我们除了要缩…...
TypeScript常用知识点整理
介绍 TypeScript 是 JavaScript 的一个超集,添加了静态类型支持和更多现代编程特性,提高了代码的可靠性和可维护性。最终会被编译成标准的 JavaScript 代码运行。 使用npm install -g typescript进行全局安装 将编写好的ts代码进行运行,第…...
【Unity实战100例】Unity入门小地图位置同步(第一第三人称)
unity小地图制作包括第一人称控制器和第三人称控制器 目录 一.选择合适自身的人称控制器 二.小地图制作...
蓝桥杯简单模板
目录 最大公约数 两个数的最大公约数 多个数的最大公约数 最小公倍数 两个数的最小公倍数 多个数的最小公倍数 素数 编辑 位数分离 正写 编辑 反写 闰年 最大公约数 两个数的最大公约数 之前看见的是辗转相除法,例如现在让算一个49,21…...
单例模式(饿汉模型,懒汉模型)
在着里我们先了解什么是单例模式。 就是某个类在进程中只能有单个实例,这里的单例模式需要一定的编程技巧,做出限制,一旦程序写的有问题,创建了多个实例,编程就会报错。 如果我们学会了单例模式,这种模式…...
torchvision中的数据集使用
torchvision中的数据集使用 使用和下载CIFAR10数据集 输出测试集中的第一个元素(输出img信息和target) 查看分类classes 打断点–>右键Debug–>找到classes 代码 import torchvisiontrain_set torchvision.datasets.CIFAR10(root"./data…...
linux 迁移home目录以及修改conda中pip的目录,修改pip安装路径
1)sudo rsync -av /home/lrf /data/home/lrf 将/home目录下的文件进行复制(假设机械硬盘挂载在/data目录下)** 2)usermod -d /data/home/lrf -m lrf 修改用户$HOME变量** 3)vi /etc/passwd 查看对应用户的$HOME变量是…...
PowerInfer:基于稀疏激活的LLM推理引擎,消费级GPU运行百亿大模型
1. 项目概述:当大模型推理遇见“热点激活”最近在折腾本地大模型部署的朋友,可能都绕不开一个核心痛点:显存。动辄几十GB的模型,配上动辄几十GB的推理显存需求,让消费级显卡(比如我们常见的24GB显存的RTX 4…...
【ElevenLabs匈牙利语音实战指南】:2024最新API调用、音色微调与本地化合规避坑全解析
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs匈牙利语音支持概览与本地化价值定位 ElevenLabs 自 2024 年 3 月起正式引入匈牙利语(hu-HU)语音合成支持,成为其首批覆盖的中东欧语言之一。该能力依托于…...
Maestro:基于YAML的声明式任务编排引擎,实现DevOps自动化工作流
1. 项目概述:从“指挥家”到“自动化交响乐”在软件开发和运维的世界里,我们常常扮演着“救火队员”的角色。一个微服务挂了,需要手动登录服务器查看日志;一个API接口响应慢了,得去翻监控图表找原因;新功能…...
AI智能体可观测性实战:用AgentOps实现全链路追踪与性能优化
1. 项目概述:当AI智能体遇上“黑匣子”,我们如何看清它的每一步?如果你最近在折腾AI智能体(Agent),无论是用LangChain、AutoGPT还是自己手搓的框架,大概率会遇到一个共同的痛点:调试…...
百度网盘Mac版破解插件:免费解锁SVIP高速下载的终极指南
百度网盘Mac版破解插件:免费解锁SVIP高速下载的终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版的龟速下载而烦…...
Motrix WebExtension:浏览器下载加速的终极解决方案
Motrix WebExtension:浏览器下载加速的终极解决方案 【免费下载链接】motrix-webextension A browser extension for the Motrix Download Manager and its forks 项目地址: https://gitcode.com/gh_mirrors/mo/motrix-webextension 在当今数字时代ÿ…...
ElevenLabs泰米尔语音部署踩坑实录:DNS解析超时、UTF-8 BOM导致静音、方言ID混淆——97%开发者忽略的3个关键参数
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs泰米尔语音部署踩坑实录:DNS解析超时、UTF-8 BOM导致静音、方言ID混淆——97%开发者忽略的3个关键参数 DNS解析超时:被忽略的区域路由策略 ElevenLabs 的 API 在印度…...
零代码构建HomeKit运动检测系统:Adafruit IO与itsaSNAP实战指南
1. 项目概述:零代码构建HomeKit运动检测系统想给家里的走廊、储物间或者车库入口加个自动感应灯,但又不想折腾复杂的编程和服务器搭建?或者,你手头有一些非HomeKit原生设备,希望通过苹果的“家庭”App进行统一管理&…...
Gitee领跑本土化开发体验:深度解析国内代码托管平台的选择之道
在数字化转型浪潮中,代码托管平台已成为开发者团队不可或缺的基础设施。国内市场经过多年发展,已经从单一的海外平台依赖,逐步形成了多元化的平台选择生态。其中,Gitee凭借其本土化优势脱颖而出,成为众多国内开发团队的…...
ARM64 Linux内核启动入口stext深度解析:从汇编到C环境的构建
1. 项目概述:从开机到内核的第一行代码 按下电脑的电源键,屏幕上闪过一行行启动信息,最终进入我们熟悉的操作系统界面。这个看似简单的过程背后,隐藏着一系列精密而复杂的交接仪式。对于Linux内核开发者或系统底层爱好者而言&…...
