当前位置: 代码网 > it编程>编程语言>Java > Java 后端HTTP 请求(GET/POST)传输规范

Java 后端HTTP 请求(GET/POST)传输规范

2026年04月18日 Java 我要评论
一、核心原则遵循 “restful 风格”,uri 仅表示资源,http 方法表示操作;get 仅用于查询,禁止通过 get 传递敏感数据;post 用于新增 / 修改 / 删

一、核心原则

  1. 遵循 “restful 风格”,uri 仅表示资源,http 方法表示操作;
  2. get 仅用于查询,禁止通过 get 传递敏感数据;post 用于新增 / 修改 / 删除,或传递大量 / 敏感数据;
  3. 所有接口参数、响应数据统一使用 utf-8 编码,避免乱码。

二、get 请求规范

1. 用途限制

  • 仅用于查询 / 获取资源,禁止用于新增、修改、删除操作;
  • 后端注解:统一使用@getmapping,禁止用@requestmapping(method = requestmethod.get)(冗余)。

2. 参数传递规则(java 编码落地)

(1)路径参数(唯一标识)

  • 后端用@pathvariable接收,参数名与 uri 中的占位符一致;
  • ✅ 正确代码示例:
// uri:get /api/v1/users/1001
@restcontroller
@requestmapping("/api/v1/users")
public class usercontroller {
    @getmapping("/{userid}")
    public resultdto<userinforespdto> getuserbyid(@pathvariable("userid") long userid) {
        userinforespdto user = userservice.getuserbyid(userid);
        return resultdto.success(user);
    }
}
  • ❌ 错误:用@requestparam接收唯一标识(如@requestparam("userid") long userid)。

(2)查询参数(筛选 / 分页 / 排序)

  • 后端用@requestparam接收,可设置默认值、是否必传;
  • 参数命名:小驼峰,与前端一致,禁止用下划线;
  • ✅ 正确代码示例:
// uri:get /api/v1/orders?status=paid&pagenum=1&pagesize=10
@getmapping("/orders")
public resultdto<pageinfo<orderlistrespdto>> getorderlist(
    @requestparam(value = "status", required = false) string status,
    @requestparam(value = "pagenum", defaultvalue = "1") integer pagenum,
    @requestparam(value = "pagesize", defaultvalue = "10") integer pagesize
) {
    pageinfo<orderlistrespdto> page = orderservice.getorderlist(status, pagenum, pagesize);
    return resultdto.success(page);
}

(3)复杂查询参数(多个筛选条件)

  • 封装为xxxqueryreqdto,用@modelattribute接收(避免参数过多);
  • ✅ 正确代码示例:
// 封装查询dto
@data
public class orderqueryreqdto {
    private string status;
    private string orderno;
    private localdatetime starttime;
    private localdatetime endtime;
    private integer pagenum = 1;
    private integer pagesize = 10;
}
// 接口接收
@getmapping("/orders/query")
public resultdto<pageinfo<orderlistrespdto>> queryorder(@modelattribute orderqueryreqdto querydto) {
    pageinfo<orderlistrespdto> page = orderservice.queryorder(querydto);
    return resultdto.success(page);
}

3. 长度与编码

  • 后端无需手动 url 解码(springmvc 自动解码);
  • 若参数含中文 / 特殊字符,确保application.yml中配置:
server:
  tomcat:
    uri-encoding: utf-8
spring:
  http:
    encoding:
      charset: utf-8
      enabled: true
      force: true

4. 敏感数据禁止

  • 后端通过拦截器 / 切面校验:若 get 请求参数包含password/token/phone等敏感字段,直接返回 400;
  • 示例(拦截器逻辑):
public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) {
    string method = request.getmethod();
    if ("get".equals(method)) {
        map<string, string[]> parammap = request.getparametermap();
        if (parammap.containskey("password") || parammap.containskey("token")) {
            response.setstatus(400);
            response.getwriter().write(json.tojsonstring(resultdto.fail("get请求禁止传递敏感数据")));
            return false;
        }
    }
    return true;
}

三、post 请求规范

1. 用途限制

  • 用于新增 / 修改 / 删除资源,或传递大量 / 敏感数据的查询;
  • 后端注解:统一使用@postmapping,禁止用@requestmapping(method = requestmethod.post)

2. 参数传递规则(java 编码落地)

(1)json 参数(主流)

  • 后端用@requestbody接收,参数封装为xxxreqdto,并添加 jsr380 参数校验注解;
  • ✅ 正确代码示例:
// 新增用户dto(含参数校验)
@data
@schema(description = "用户新增请求参数")
public class useraddreqdto {
    @notblank(message = "用户名不能为空")
    @size(min = 2, max = 20, message = "用户名长度需在2-20位")
    private string username;
    @notblank(message = "密码不能为空")
    @pattern(regexp = "^[a-za-z0-9@#$%^&*]{6,32}$", message = "密码仅支持字母、数字、特殊符号,长度6-32位")
    private string password;
    @pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误")
    private string phonenumber;
}
// 接口接收
@postmapping("/users")
public resultdto<long> adduser(@valid @requestbody useraddreqdto adddto) {
    long userid = userservice.adduser(adddto);
    return resultdto.success(userid, "新增用户成功");
}
  • 注意:必须加@valid触发参数校验,否则注解不生效;校验失败会抛出methodargumentnotvalidexception,需在全局异常处理器中捕获。

(2)文件上传(multipart/form-data)

  • 后端用@requestpart接收文件,@requestparam接收附加参数;
  • 配置文件上传大小限制:
spring:
  servlet:
    multipart:
      max-file-size: 10mb  # 单个文件大小
      max-request-size: 50mb # 总文件大小
  • ✅ 正确代码示例:
@postmapping("/files/upload")
public resultdto<fileuploadrespdto> uploadfile(
    @requestpart("file") multipartfile file,
    @requestparam("filename") string filename
) {
    // 校验文件类型/大小
    if (!file.getcontenttype().startswith("image/")) {
        return resultdto.fail(400, "仅支持图片上传");
    }
    fileuploadrespdto resp = fileservice.upload(file, filename);
    return resultdto.success(resp);
}

(3)幂等性保障(新增接口)

  • 后端通过 “唯一业务编号”+ 数据库唯一索引实现幂等;
  • 示例:新增订单时,前端传递orderno(uuid),后端先查后插:
@transactional(rollbackfor = exception.class)
public long addorder(ordercreatereqdto createdto) {
    // 1. 校验订单号是否已存在(幂等核心)
    if (ordermapper.existsbyorderno(createdto.getorderno())) {
        throw new businessexception("订单已存在,请勿重复提交");
    }
    // 2. 新增订单
    order order = new order();
    beanutils.copyproperties(createdto, order);
    ordermapper.insert(order);
    return order.getid();
}

3. 特殊场景:post 查询(敏感 / 大量参数)

  • 适用于参数过多(超过 url 长度限制)、含敏感数据的查询;
  • ✅ 正确代码示例:
// 复杂订单查询(参数多、含敏感条件)
@postmapping("/orders/complex-query")
public resultdto<pageinfo<orderlistrespdto>> complexquery(@requestbody ordercomplexqueryreqdto querydto) {
    pageinfo<orderlistrespdto> page = orderservice.complexquery(querydto);
    return resultdto.success(page);
}

四、通用规范(get/post 均适用)

1. uri 命名规则(java 编码落地)

  • controller 类上的@requestmapping统一以/api/v{版本号}/开头,资源用复数名词;
  • ✅ 正确:@requestmapping("/api/v1/users"),❌ 错误:@requestmapping("/api/v1/user")/@requestmapping("/api/v1/getuser")

2. 响应规范(统一返回体)

  • 后端封装通用响应类resultdto,所有接口统一返回该类型,禁止直接返回业务对象 / 字符串;
  • ✅ 通用响应类代码:
@data
public class resultdto<t> {
    // 状态码:200成功,400参数错误,403权限不足,500服务异常
    private integer code;
    // 提示信息
    private string msg;
    // 业务数据
    private t data;
    // 成功响应(带数据)
    public static <t> resultdto<t> success(t data) {
        resultdto<t> result = new resultdto<>();
        result.setcode(200);
        result.setmsg("操作成功");
        result.setdata(data);
        return result;
    }
    // 成功响应(无数据)
    public static resultdto<void> success() {
        return success(null);
    }
    // 失败响应
    public static resultdto<void> fail(integer code, string msg) {
        resultdto<void> result = new resultdto<>();
        result.setcode(code);
        result.setmsg(msg);
        return result;
    }
}

3. 异常处理(java 编码落地)

  • 全局异常处理器统一捕获所有异常,返回标准化resultdto,禁止接口抛出未捕获异常;
  • ✅ 全局异常处理器代码:
@restcontrolleradvice
public class globalexceptionhandler {
    // 捕获参数校验异常
    @exceptionhandler(methodargumentnotvalidexception.class)
    public resultdto<void> handlevalidexception(methodargumentnotvalidexception e) {
        string msg = e.getbindingresult().getfielderror().getdefaultmessage();
        return resultdto.fail(400, msg);
    }
    // 捕获自定义业务异常
    @exceptionhandler(businessexception.class)
    public resultdto<void> handlebusinessexception(businessexception e) {
        return resultdto.fail(e.getcode(), e.getmessage());
    }
    // 捕获所有未处理的异常
    @exceptionhandler(exception.class)
    public resultdto<void> handleexception(exception e) {
        // 记录详细异常日志
        log.error("服务端异常", e);
        return resultdto.fail(500, "服务器内部错误,请稍后重试");
    }
}

4. 接口版本控制

  • 后端通过 uri 携带版本号(推荐),禁止通过参数(如?version=1)或请求头控制版本;
  • ✅ 正确:@requestmapping("/api/v1/users")@requestmapping("/api/v2/users")

五、反例与正例对照表(java 编码)

表格

场景反例(禁止)正例(推荐)
get 查询单个用户@getmapping("/getuser") + @requestparam("userid") long userid@getmapping("/{userid}") + @pathvariable long userid
post 新增用户@postmapping("/adduser") + url 传参@postmapping("/users") + @requestbody useraddreqdto
响应数据return user;(直接返回业务对象)return resultdto.success(user);
参数校验手动 if 判断(if (username == null) { throw new exception(); }jsr380 注解(@notblank)+ @valid

六、java 后端编码额外规范

  1. 请求头规范
    • 跨域请求:后端配置corsconfig,允许前端的 origin、method、header;
    • 认证请求:token 统一放在authorization请求头,后端用@requestheader("authorization") string token接收。
  2. 日志规范
    • 所有接口入参 / 出参必须打印日志(使用 slf4j),禁止打印敏感数据(如密码);
    • ✅ 示例:
@getmapping("/{userid}")
public resultdto<userinforespdto> getuserbyid(@pathvariable("userid") long userid) {
    log.info("【查询用户】入参:userid={}", userid);
    userinforespdto user = userservice.getuserbyid(userid);
    log.info("【查询用户】出参:{}", json.tojsonstring(user));
    return resultdto.success(user);
}
  1. 性能规范
    • get 请求建议添加缓存(如 redis),避免频繁查库;
    • post 请求建议异步处理(如 mq),耗时操作(如文件解析、数据同步)不阻塞接口响应。

总结

  1. 编码核心:get 用@pathvariable/@requestparam,post 用@requestbody,参数校验用 jsr380+@valid
  2. 响应核心:所有接口统一返回resultdto,异常统一由globalexceptionhandler捕获;
  3. 安全核心:get 禁止传敏感数据,post 新增接口保证幂等,日志屏蔽敏感信息;
  4. 规范核心:uri 用小写复数名词 + 版本号,参数命名小驼峰,编码统一 utf-8。
请求类型参数传递位置前端核心写法(示例)后端核心写法(java)适用场景关键规范 / 注意事项
geturl 路径参数axios.get('/api/v1/users/1001')@getmapping("/{userid}")@pathvariable("userid") long userid查询单个资源(如查用户 / 订单)1. 路径参数为唯一标识(id / 编号)2. uri 用复数名词,小写
geturl 查询参数axios.get('/api/v1/orders', { params: { status: 'paid', pagenum: 1 } })@getmapping("/orders")@requestparam string status@requestparam integer pagenum列表筛选 / 分页 / 排序1. 参数名小驼峰2. 非必传参数加required = false3. 可封装为 dto 用@modelattribute接收
postrequest body(json)axios.post('/api/v1/users', { username: '张三', password: '123456' })@postmapping("/users")@valid @requestbody useraddreqdto adddto新增 / 修改资源、复杂查询1. 必加@valid触发参数校验2. dto 加 jsr380 注解(@notblank/@pattern)3. content-type: application/json
postform data(表单)let formdata = new formdata();formdata.append('username', '张三');axios.post('/api/v1/users/login', formdata)@postmapping("/login")@requestparam string username@requestparam string password简单表单提交(如登录)1. content-type: application/x-www-form-urlencoded2. 敏感数据建议转 json 传递
postmultipart form data(文件 + 参数)let formdata = new formdata();formdata.append('file', file);formdata.append('filename', '头像.png');axios.post('/api/v1/files/upload', formdata)@postmapping("/upload")@requestpart("file") multipartfile file@requestparam("filename") string filename文件上传(单 / 多文件)1. 配置文件大小限制(spring.servlet.multipart)2. 文件参数名统一为file
get/post请求头参数axios.get('/api/v1/users', { headers: { authorization: 'bearer token123' } })@requestheader("authorization") string token传递 token / 语言 / 版本等1. 认证 token 统一放authorization头2. 非敏感、固定参数用请求头
post混合参数(路径 + json)axios.post('/api/v1/users/1001/update', { phone: '13800138000' })@postmapping("/{userid}/update")@pathvariable long userid@requestbody userupdatereqdto updatedto修改单个资源(带 id + 参数)1. 路径传唯一标识,body 传修改参数2. 禁止路径传大量参数

补充:说明(前后端协作关键)

1. 通用数据格式

  • 字符编码:前后端统一用 utf-8
  • 日期格式:统一用 yyyy-mm-dd hh:mm:ss(前端传字符串,后端用@datetimeformat接收):
// 后端接收日期示例
@getmapping("/orders")
public resultdto<?> getorders(@requestparam @datetimeformat(pattern = "yyyy-mm-dd hh:mm:ss") localdatetime starttime) {
    // 业务逻辑
}
  • 数值类型:前端传递数字(如pagenum: 1),禁止传字符串(如pagenum: "1"),后端用integer/long接收。

2. 错误码 / 响应格式统一

表格

响应场景前端接收格式后端返回写法
成功{ code: 200, msg: "成功", data: {} }resultdto.success(data)
参数校验失败{ code: 400, msg: "用户名不能为空" }resultdto.fail(400, "用户名不能为空")
权限不足{ code: 403, msg: "无权限" }resultdto.fail(403, "无权限")
服务端异常{ code: 500, msg: "服务器错误" }resultdto.fail(500, "服务器错误")

3. 反例对照(禁止写法)

表格

场景前端反例后端反例问题说明
get 传敏感数据axios.get('/login?pwd=123456')@requestparam string pwd密码暴露在 url / 日志中
post 用 url 传大量参数axios.post('/users?name=张三&age=20&phone=138...')@requestparam接收 10 + 个参数url 长度有限制,可读性差
路径参数用动词axios.get('/api/v1/getuser/1001')@getmapping("/getuser/{userid}")违反 restful 规范,uri 仅表示资源
文件上传用 jsonaxios.post('/upload', { file: fileobj })@requestbody接收文件json 无法传输二进制文件

总结

  1. 核心匹配:路径参数→@pathvariable、查询参数→@requestparam、json→@requestbody、文件→@requestpart
  2. 场景优先:查询用 get(路径 / 查询参数),新增 / 修改 / 文件用 post(json/formdata);
  3. 规范统一:参数名小驼峰、日期格式统一、响应体结构一致,前后端按表对齐即可避免 90% 的参数传递问题。

到此这篇关于java 后端http 请求(get/post)传输规范的文章就介绍到这了,更多相关java http请求内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com