博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring API 开发简单示例及技巧
阅读量:6995 次
发布时间:2019-06-27

本文共 5934 字,大约阅读时间需要 19 分钟。

img_2b717f100b46ac3a5174e2368955e1fd.png
目录.png

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


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

使用spring mvc默认配置就可以返回json了,不过需要jacksonjar

APIResponse是一个实体类,配合@ResponseBody就会自动转成Json

@RequestMapping("user")@Controllerpublic 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
header; /** * 请求参数 */ private Map
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
(); 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
getParamesMap(Map properties) { Map
returnMap = new HashMap
(); 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
(); params.put(s, o.toString()); } // 省略 get set method. 自行补充 ......}

在控制层controller中实现栗子:

@RequestMapping("user")@Controllerpublic 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 层的逻辑处理如下

@Servicepublic 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
users = mapper.selectAllUser(); return APIUtil.getResponse(API_SUCCESS, users); }}

转载地址:http://zjdvl.baihongyu.com/

你可能感兴趣的文章
Oracle体系结构之检查点
查看>>
SQL Server 2017 AlwaysOn on Linux 配置和维护(15)
查看>>
以太坊的势与局
查看>>
如何结合使用 Subversion 和 Eclipse
查看>>
ELK 实验(五)配置数据源和仪表盘
查看>>
centos 6.3搭建个人私有云存储owncloud
查看>>
PHP中的浅拷贝和深拷贝
查看>>
利用redis-sentinel+keepalived实现redis高可用
查看>>
CloudStack4.2登录报用户名或密码错误问题解析
查看>>
逻辑备库之ORA-01403解决方法
查看>>
MySQL Replication(复制)基本原理
查看>>
分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(12月5日-12月11日)
查看>>
十年老站吐血迁移实录
查看>>
配置Exchange2010的边缘传输服务器
查看>>
我的家庭私有云计划-7
查看>>
Word中使用正则表达式进行查找和替换
查看>>
Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1
查看>>
微软MVP社区巡讲
查看>>
Silverlight3游戏开发之空当接龙基础篇
查看>>
.NET深入解析LINQ框架(二:LINQ优雅的前奏)
查看>>