Spring API 开发简单示例及技巧

简介: 目录.png以用户登录为栗子,示例API请求时处理技巧,和API返回数据时如何处理。一、API返回时:返回的json数据使用spring mvc默认配置就可以返回json了,不过需要jackson的jar包APIResponse是一...
img_2b717f100b46ac3a5174e2368955e1fd.png
目录.png

以用户登录为栗子,示例API请求时处理技巧,和API返回数据时如何处理。


一、API返回时:返回的json数据

使用spring mvc默认配置就可以返回json了,不过需要jacksonjar
APIResponse是一个实体类,配合@ResponseBody就会自动转成Json

@RequestMapping("user")
@Controller
public class UserController {

    @Resource
    private UserService userService;

    @RequestMapping(value = "/login", method = RequestMethod.POST, headers = "api-version=1")
    public @ResponseBody
    APIResponse login(HttpServletRequest request) {
        return userService.login(new APIRequest(request));
    }

    @RequestMapping(value = "/query", method = RequestMethod.GET, headers = "api-version=1")
    public @ResponseBody
    APIResponse query() {
        return userService.allUsers();
    }
}


二、API请求时:提取和解析参数

springMVC后台控制层提取和解析请求参数的方式主要有两种

  • request.getParameter("name")
  • 通过注解@RequestParam直接获取;
1.注解方式:@ResponseBody
// 必传且参数名为`userName`
@RequestParam String userName

// 必传且指定参数为 user_name
@RequestParam(value="user_name") String userName

// 标识是否为必传,required=false 会给参数赋值为null
@RequestParam(value="aa", required=true)

完整的如下:

@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("user_name") String userName) {
  APIResponse api = new APIResponse();
  api.setUserName(userName);
  ...
   
}

value用来指定要传入值的id名称
String userName, ModelMap model 是接受 value 传给的值


2.HttpServletRequest 方式

如果参较多的时候,注解方式可能显得比较臃肿,这时候也可以使用HttpServletRequest提取参数,request.getParameter("username")也比较简单。
这里着重Controller中接收的HttpServletRequest做进一步封装。

APIRequestHttpServletRequest进一步封装,提供常用的属性包括请求的URL、请求参数等。如果提供的属性不能满足需求,还提供了原 HttpServletRequest 对象属性 request。

创建 API 请求的实体类

package com.lugq.web.tools.api;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * API请求实体类
 */
public class APIRequest {

    /**
     * Raw Request, 单元测试时为null
     */
    private HttpServletRequest request;

    /**
     * 请求头
     */
    private Map<String, Object> header;

    /**
     * 请求参数
     */
    private Map<String, Object> params;

    /**
     * 客户端发出请求时的完整URL
     */
    private String url;

    /**
     * 请求行中的资源名部分
     */
    private String uri;

    /**
     * 请求行中的参数部分
     */
    private String queryString;

    /**
     * 请求方法
     */
    private String method;

    /**
     * 发出请求的客户机的IP地址
     */
    private String remoteAddr;

    /**
     * 发出请求的客户机的完整主机名
     */
    private String remoteHost;

    /**
     * 发出请求的客户机的网络端口号
     */
    private int remotePort;

    /**
     * WEB服务器的IP地址
     */
    private String localAddr;

    /**
     * WEB服务器的主机名
     */
    private String localName;

    /**
     * WEB服务器的网络端口号
     */
    private int localPort;

    /**
     * 编码格式
     */
    private String characterEncoding;

    /**
     * 上下文
     */
    private String contextPath;

    public APIRequest() {
        super();
    }

    public APIRequest(HttpServletRequest request) {

        this.request = request;

        header = new HashMap<String, Object>();
        Enumeration e = request.getHeaderNames();
        while (e.hasMoreElements()) {
            String name = (String) e.nextElement();
            Object value = request.getHeader(name);
            header.put(name, value);
        }

        params = getParamesMap(request.getParameterMap());
        url = request.getRequestURL().toString();
        uri = request.getRequestURI();
        remoteAddr = request.getRemoteAddr();
        remoteHost = request.getRemoteHost();
        remotePort = request.getRemotePort();
        contextPath = request.getContextPath();
        localAddr = request.getLocalAddr();
        characterEncoding = request.getCharacterEncoding();
        localName = request.getLocalName();
        localPort = request.getLocalPort();
        method = request.getMethod();
        queryString = request.getQueryString();
    }

    private Map<String, Object> getParamesMap(Map properties) {
        Map<String, Object> returnMap = new HashMap<String, Object>();
        Iterator entries = properties.entrySet().iterator();
        Map.Entry entry;
        String name;
        String value = "";
        while (entries.hasNext()) {
            entry = (Map.Entry) entries.next();
            name = (String) entry.getKey();
            Object valueObj = entry.getValue();
            if (null == valueObj) {
                value = "";
            } else if (valueObj instanceof String[]) {
                String[] values = (String[]) valueObj;
                for (String v : values) {
                    value = v + ",";
                }
                value = value.substring(0, value.length() - 1);
            } else {
                value = valueObj.toString();
            }
            returnMap.put(name, value);
        }
        return returnMap;
    }

    public Object getParameter(String s) {
        return params.get(s);
    }

    public void setAttribute(String s, Object o) {
        if (params == null) params = new HashMap<String, Object>();
        params.put(s, o.toString());
    }

    // 省略 get set method. 自行补充
    ......
}

在控制层controller中实现栗子:

@RequestMapping("user")
@Controller
public class UserController {

    @Resource
    private UserService userService;

    @RequestMapping(value = "/login", method = RequestMethod.POST, headers = "api-version=1")
    public @ResponseBody
    APIResponse login(HttpServletRequest request) {
        // 将HttpServletRequest实例赋值到APIRequest对其进一步封装
        return userService.login(new APIRequest(request));
    }

}

Service 层的逻辑处理如下

@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper mapper;

    public APIResponse login(APIRequest request) {
        // 获取请求参数
        String username = (String) request.getParameter("username");
        String password = (String) request.getParameter("password");
        // 处理业务逻辑
        User user = mapper.selectUserByUsername(username);
        APIStatus status = API_SUCCESS;
        if (user == null) {
            status = API_USER_NOT_EXIST;
        } else {
            if (!MD5Util.md5(password).equals(user.getPassword()))
                status = API_USER_PASSWORD_ERROR;
        }
        // 返回APIResponse对象,配合@ResponseBody转为Json
        return APIUtil.getResponse(status, user);
    }

    public APIResponse allUsers() {
        List<User> users = mapper.selectAllUser();
        return APIUtil.getResponse(API_SUCCESS, users);
    }
}
目录
相关文章
|
7天前
|
安全 Java API
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)(上)
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)
27 0
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)(上)
|
30天前
|
XML 开发框架 Java
Spring轻量级开发框架(二)
Spring轻量级开发框架
47 0
|
1月前
|
开发框架 安全 Java
Spring 框架:企业级应用开发的强大工具
在当今数字化时代,企业级应用开发的需求日益增长。为了满足这一需求,开发者们需要一款功能强大、易于使用的开发框架。Spring 框架作为 Java 领域的领先者,为企业级应用开发提供了全面的解决方案。本文将深入探讨 Spring 框架的各个方面,包括其历史、核心模块、优势以及应用场景。
24 0
|
28天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
66 1
|
28天前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
66 0
|
2天前
|
安全 Java API
Spring工厂API与原理
Spring工厂API与原理
23 10
|
3天前
|
人工智能 机器人 API
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
7 0
|
3天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
8 0
|
8天前
|
JSON Java fastjson
Spring Boot 底层级探索系列 04 - Web 开发(2)
Spring Boot 底层级探索系列 04 - Web 开发(2)
16 0
|
9天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例