Java-Spark处理HTTP GET请求时请求体丢失问题咨询
问题原因
你的问题和鉴权逻辑无关,核心是两个层面的错误:
- 框架默认逻辑符合HTTP规范设计
你使用的Spark Java框架默认不会解析GET请求的请求体。按照HTTP协议规范(RFC 7231),GET方法的语义是从服务端获取资源,请求体没有约定的统一业务语义,因此几乎所有主流Web框架、网关、反向代理都默认不会缓存、解析GET请求携带的body内容,不少中间件甚至会直接丢弃GET请求的body部分。
你调用的request.body()方法,Spark只会在请求方法是POST、PUT、PATCH这类规范允许携带请求体的类型时,才会提前读取请求流把内容存入body字段,GET请求下这个字段默认是空值。 - 接口设计属于反模式
给GET请求携带请求体本身就是不推荐的错误设计,哪怕你手动修改框架配置读到了body,经过Nginx、CDN、API网关这类中间件的时候,body也大概率会被直接丢弃,接口兼容性极差。
修复方案
- 常规推荐做法:把接口的请求方法从GET改成POST(也可以根据业务语义选择PUT/PATCH),对应请求行的方法也同步改成POST,就能正常打印出请求体里的
Hello内容,修改后的核心代码示例:
public class Test { public static void main(String[] args) { // 将get改为post Spark.post("contacts/get-all", (request, response) -> { checkForAuth(request); if (request != null) { System.out.println(request.body()); } return "Success"; }); } protected static void checkForAuth(Request request) { if (request != null) { String authorization = request.headers("Authorization"); System.out.println(authorization); if ("test".equals(authorization)) return; } throw new Error("Not Authorized."); } }
对应的请求修改为:
POST http://localhost:4567/contacts/get-all Authorization : test Content-Type : text/plain Hello
- 不推荐的特殊处理:如果你一定要在GET请求里读取body,需要手动获取底层的HttpServletRequest对象,直接读取原始请求流,但这种做法兼容性极差,没有特殊需求不要使用。
内容的提问来源于stack exchange,提问作者xtay2
相关产品推荐
相关产品推荐

