Skip to content

HttpRequest ​

原始二进制请求体 ​

框架按 Content-Type 识别请求体。application/x-www-form-urlencoded 使用表单解析,multipart/form-data 使用文件表单解析,JSON 和纯文本使用文本格式。application/octet-stream、图片和其他未映射的媒体类型使用 RequestBodyFormat.RAW,通过 request.getBody() 获取原始字节,不进行 URL 解码或字符串转换。

java
import nexus.io.model.body.RespBodyVo;
import nexus.io.tio.boot.http.TioRequestContext;
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.http.common.HttpResponse;

public class BinaryLengthHandler {
  public HttpResponse handle(HttpRequest request) {
    byte[] body = request.getBody();
    int length = body == null ? 0 : body.length;
    return TioRequestContext.getResponse().body(RespBodyVo.ok(length));
  }
}

原始字节模式保留 %、&、零字节及非 UTF-8 数据,适合二进制协议和文件内容。请求大小仍受 HTTP 配置限制;没有 Content-Type 的请求沿用默认表单解析行为。

1. HttpRequest(Node remote) ​

  • 说明: 构造一个 HttpRequest 对象,并设置远程节点。
  • 用法:
    java
    Node remoteNode = new Node("127.0.0.1", 8080);
    HttpRequest httpRequest = new HttpRequest(remoteNode);

2. HttpRequest() ​

  • 说明: 创建一个无参的 HttpRequest 对象。
  • 用法:
    java
    HttpRequest httpRequest = new HttpRequest();

3. close() ​

  • 说明: 关闭此 HttpRequest 的连接。
  • 用法:
    java
    httpRequest.close();

4. close(String remark) ​

  • 说明: 带备注的关闭此 HttpRequest 的连接。
  • 用法:
    java
    httpRequest.close("Connection closed due to timeout.");

5. addParam(String key, Object value) ​

  • 说明: 向 HttpRequest 添加一个参数。
  • 用法:
    java
    httpRequest.addParam("username", "user123");

6. forward(String newPath) ​

  • 说明: 将 HttpRequest 转发到新的路径。
  • 用法:
    java
    httpRequest.forward("/new/path");

7. getBodyFormat() ​

  • 说明: 获取 HttpRequest 的请求体格式。
  • 用法:
    java
    RequestBodyFormat bodyFormat = httpRequest.getBodyFormat();

8. getUserAgent() ​

  • 说明: 获取用户代理字符串。
  • 用法:
    java
    String userAgent = httpRequest.getUserAgent();

9. getHost() ​

  • 说明: 获取请求头中的 host 字段值。
  • 用法:
    java
    String host = httpRequest.getHost();

10. getClientIp() ​

  • 说明: 获取真实的客户端 IP 地址。
  • 用法:
    java
    String clientIp = httpRequest.getClientIp();

11. addHeader(String key, String value) ​

  • 说明: 添加一个 HTTP 头字段。
  • 用法:
    java
    httpRequest.addHeader("Content-Type", "application/json");

18. getDomain() ​

  • 说明: 获取请求域名。
  • 用法:
    java
    String domain = httpRequest.getDomain();

13. getBodyString() ​

  • 说明: 获取请求体的字符串表示形式。
  • 用法:
    java
    String bodyString = httpRequest.getBodyString();

18. getChannelContext() ​

  • 说明: 获取当前 HTTP 请求的通道上下文。
  • 用法:
    java
    ChannelContext channelContext = httpRequest.getChannelContext();

18. getContentLength() ​

  • 说明: 获取请求体的长度。
  • 用法:
    java
    int contentLength = httpRequest.getContentLength();

16. getCookie(String cooiename) ​

  • 说明: 根据名称获取一个 Cookie 对象。
  • 用法:
    java
    Cookie cookie = httpRequest.getCookie("session_id");

18. getCookieMap() ​

  • 说明: 获取所有 Cookie 的映射。
  • 用法:
    java
    Map<String, Cookie> cookieMap = httpRequest.getCookieMap();

18. getCookies() ​

  • 说明: 获取所有 Cookies 的列表。
  • 用法:
    java
    List<Cookie> cookies = httpRequest.getCookies();

19. getHttpConfig() ​

  • 说明: 获取 HTTP 配置。
  • 用法:
    java
    HttpConfig httpConfig = httpRequest.getHttpConfig();

20. getHttpSession() ​

  • 说明: 获取 HTTP 会话。
  • 用法:
    java
    HttpSession httpSession = httpRequest.getHttpSession();

21. getHeader(String key) ​

  • 说明: 获取指定 HTTP 头的值。
  • 用法:
    java
    String value = httpRequest.getHeader("Accept");

22. getIsAjax() ​

  • 说明: 判断请求是否是 Ajax 请求。
  • 用法:
    java
    Boolean isAjax = httpRequest.getIsAjax();

23. getIsSupportGzip() ​

  • 说明: 判断请求是否

支持 Gzip 压缩。

  • 用法:
    java
    Boolean isSupportGzip = httpRequest.getIsSupportGzip();

24. getParams() ​

  • 说明: 获取所有请求参数的映射。
  • 用法:
    java
    Map<String, Object[]> params = httpRequest.getParams();

25. getParam() ​

  • 说明: 获取单个请求参数。
  • 用法:
    java
    Object param = httpRequest.getParam("key");

26. getString(String name) ​

  • 说明: 获取指定名称的字符串参数。
  • 用法:
    java
    String value = httpRequest.getString("name");

27. getInt(String name) ​

  • 说明: 获取指定名称的整型参数。
  • 用法:
    java
    Integer intValue = httpRequest.getInt("age");

28. getRemote() ​

  • 说明: 获取远程节点信息。
  • 用法:
    java
    Node remote = httpRequest.getRemote();

29. getRequestLine() ​

  • 说明: 获取请求行信息
  • 用法:
    java
    RequestLine requestLine = httpRequest.getRequestLine();

30. logstr() ​

  • 说明: 返回 HttpRequest 的日志字符串,通常包含请求 ID、头部信息和请求体。
  • 用法:
    java
    String logString = httpRequest.logstr();

31. parseCookie(HttpConfig httpConfig) ​

  • 说明: 解析 HttpRequest 中的 Cookie 信息。
  • 用法:
    java
    httpRequest.parseCookie(httpConfig);

32. setBodyFormat(RequestBodyFormat bodyFormat) ​

  • 说明: 设置 HttpRequest 的请求体格式。
  • 用法:
    java
    httpRequest.setBodyFormat(RequestBodyFormat.JSON);

33. setBodyString(String bodyString) ​

  • 说明: 设置 HttpRequest 的请求体内容。
  • 用法:
    java
    httpRequest.setBodyString("{\"name\":\"John\"}");

34. setChannelContext(ChannelContext channelContext) ​

  • 说明: 设置 HttpRequest 的通道上下文。
  • 用法:
    java
    httpRequest.setChannelContext(channelContext);

35. setCharset(String charset) ​

  • 说明: 设置 HttpRequest 的字符集。
  • 用法:
    java
    httpRequest.setCharset("UTF-8");

36. setContentLength(int contentLength) ​

  • 说明: 设置 HttpRequest 的内容长度。
  • 用法:
    java
    httpRequest.setContentLength(1024);
  • 说明: 设置 HttpRequest 的 Cookie 映射。
  • 用法:
    java
    httpRequest.setCookieMap(cookieMap);
  • 说明: 设置 HttpRequest 的 Cookies 列表。
  • 用法:
    java
    httpRequest.setCookies(cookies);

39. setHeaders(Map<String, String> headers) ​

  • 说明: 设置 HttpRequest 的头部信息。
  • 用法:
    java
    Map<String, String> headers = new HashMap<>();
    headers.put("Content-Type", "application/json");
    httpRequest.setHeaders(headers);

40. setHttpConfig(HttpConfig httpConfig) ​

  • 说明: 设置 HttpRequest 的 HTTP 配置。
  • 用法:
    java
    httpRequest.setHttpConfig(httpConfig);

41. setHttpSession(HttpSession httpSession) ​

  • 说明: 设置 HttpRequest 的 HTTP 会话。
  • 用法:
    java
    httpRequest.setHttpSession(httpSession);

42. setIsAjax(Boolean isAjax) ​

  • 说明: 设置 HttpRequest 是否为 Ajax 请求。
  • 用法:
    java
    httpRequest.setIsAjax(true);

43. setIsSupportGzip(Boolean isSupportGzip) ​

  • 说明: 设置 HttpRequest 是否支持 Gzip 压缩。
  • 用法:
    java
    httpRequest.setIsSupportGzip(true);

44. setParams(Map<String, Object[]> params) ​

  • 说明: 设置 HttpRequest 的参数映射。
  • 用法:
    java
    Map<String, Object[]> params = new HashMap<>();
    params.put("key", new Object[]{"value"});
    httpRequest.setParams(params);

45. setRemote(Node remote) ​

  • 说明: 设置 HttpRequest 的远程节点信息。
  • 用法:
    java
    httpRequest.setRemote(new Node("127.0.0.1", 8080));

46. setRequestLine(RequestLine requestLine) ​

  • 说明: 设置 HttpRequest 的请求行。
  • 用法:
    java
    RequestLine requestLine = new RequestLine("GET", "/api/data", "HTTP/1.1");
    httpRequest.setRequestLine(requestLine);

47. toString() ​

  • 说明: 返回 HttpRequest 对象的字符串表示。
  • 用法:
    java
    String httpRequestString = httpRequest.toString();

48. isClosed() ​

  • 说明: 检查 HttpRequest 是否已关闭。
  • 用法:
    java
    boolean isClosed = httpRequest.isClosed();

49. setClosed(boolean closed) ​

  • 说明: 设置 HttpRequest 的关闭状态。
  • 用法:
    java
    httpRequest.setClosed(true);

50. getConnection() ​

  • 说明: 获取 HttpRequest 的连接信息

。

  • 用法:
    java
    String connection = httpRequest.getConnection();

51. setConnection(String connection) ​

  • 说明: 设置 HttpRequest 的连接信息。
  • 用法:
    java
    httpRequest.setConnection("keep-alive");

52. getReferer() ​

  • 说明: 获取请求头中的 Referer 字段。
  • 用法:
    java
    String referer = httpRequest.getReferer();

53. isNeedForward() ​

  • 说明: 检查 HttpRequest 是否需要转发。
  • 用法:
    java
    boolean needForward = httpRequest.isNeedForward();

54. setNeedForward(boolean needForward) ​

  • 说明: 设置 HttpRequest 是否需要转发。
  • 用法:
    java
    httpRequest.setNeedForward(true);

55. isForward() ​

  • 说明: 检查 HttpRequest 是否正在转发。
  • 用法:
    java
    boolean isForwarding = httpRequest.isForward();

56. setForward(boolean isForward) ​

  • 说明: 设置 HttpRequest 的转发状态。
  • 用法:
    java
    httpRequest.setForward(true);

57. getRequestMap() ​

返回一份可修改的参数 Map,只包含框架已经解码的查询与表单参数,不解析 JSON 正文。重复参数取第一个值,修改返回值不会改变原有参数表。getParam()、getObject()、getLong() 等方法保持原有取值规则。

java
import com.jfinal.kit.Kv;
import nexus.io.model.body.RespBodyVo;
import nexus.io.tio.boot.http.TioRequestContext;
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.http.common.HttpResponse;
import nexus.io.tio.utils.validator.ParameterValidator;

public class FormTitleHandler {
  public HttpResponse handle(HttpRequest request) {
    Kv parameters = Kv.create().set(request.getRequestMap());
    String title = ParameterValidator.text(parameters.get("title"), "title", 200);
    return TioRequestContext.getResponse().respond(RespBodyVo.ok(title));
  }
}
  • application/x-www-form-urlencoded 和 multipart/form-data 的字段由框架按 Content-Type 解码,应用无需再次解析表单正文。
  • JSON 请求没有查询或表单参数时返回空 Map,即使正文包含字段。读取参数集合不会触发 JSON 格式校验。
  • 文本正文使用 getBodyString(),二进制正文使用 getBodyBytes()。请求大小统一由框架解码层配置控制。

JSON 正文:getBodyObject(Class<T>) ​

确定的 JSON 字段使用请求实体,可以直接读取:

java
import com.example.model.VideoGenerationRequest;
import nexus.io.tio.http.common.HttpRequest;

public class VideoParameters {
  public VideoGenerationRequest read(HttpRequest request) {
    return request.getBodyObject(VideoGenerationRequest.class);
  }
}

实体单独放在 model 包下:

java
package com.example.model;

public record VideoGenerationRequest(String prompt, Integer duration) {
}

该方法等价于显式读取、解析正文并校验结果:

java
import com.example.model.VideoGenerationRequest;
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.utils.json.JsonUtils;
import nexus.io.tio.utils.validator.ParameterValidator;

public class VideoJsonParameters {
  public VideoGenerationRequest read(HttpRequest request) {
    String bodyString = request.getBodyString();
    VideoGenerationRequest input = bodyString == null ? null : JsonUtils.parse(bodyString, VideoGenerationRequest.class);
    ParameterValidator.require(input != null, "Request body is required");
    return input;
  }
}

getBodyObject() 使用配置的 JSON provider,只解析当前正文,不合并查询或表单字段,也不缓存结果。正文为 Java null 时跳过解析,并与解析结果为 null 的情况共用一次非空校验,抛出 ParameterValidationException("Request body is required");JSON 文本 null 也会被该校验拒绝。其他类型转换和解析异常沿用 JsonUtils.parse 的规则。字段必填与业务规则由独立校验工具调用 ParameterValidator 检查,全局异常处理器分别捕获 ParameterValidationException 和所用 JSON provider 的解析异常,统一返回 HTTP 400。异常响应使用固定的格式错误提示,避免暴露原始正文。

动态 JSON 字段可以先解析 Map,再包装为 Kv:

java
import java.util.Map;
import com.jfinal.kit.Kv;
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.utils.json.JsonUtils;

public class DynamicJsonParameters {
  public Kv read(HttpRequest request) {
    String bodyString = request.getBodyString();
    Map<String, Object> map = JsonUtils.parseToMap(bodyString, String.class, Object.class);
    return Kv.create().set(map);
  }
}

例如请求地址为 /video?duration=99、JSON 正文为 {"prompt":"演示","duration":10},getRequestMap() 读取到查询值 "99",getBodyObject(VideoGenerationRequest.class) 读取到正文值 10。正文未提供 duration 时,请求实体中的该字段为 null,不会从查询参数补入。

58. getBearerToken() ​

从 Authorization 请求头提取 token,返回类型为 String。对应 nexus.io.tio.http.common.HttpRequest,随 tio-http-common 提供。

java
String authorization = request.getAuthorization(); // 原始请求头
String token = request.getBearerToken();           // 去掉精确的 "Bearer " 前缀

当前实现等价于:

java
public String getBearerToken() {
  String token = getAuthorization();
  return token != null && token.startsWith("Bearer ") ? token.substring(7) : token;
}
Authorization 请求头返回值
未提供null
Bearer example-tokenexample-token
example-tokenexample-token
Bearer (末尾一个空格)空字符串
bearer example-token原值 bearer example-token
Basic abc原值 Basic abc
Bearer example-token (前缀后多一个空格)example-token,保留额外空白

前缀匹配区分大小写,不会调用 trim(),不会读取 URL 参数或名为 token 的独立请求头,也不会修改原始 Authorization。这里描述的是当前方法实现,不是对 HTTP 认证方案大小写规则的重新定义。

该方法只提取字符串,不验证 JWT 签名、有效期、会话撤销状态或业务权限。受保护的入口仍应在 身份验证拦截器 中验证 token;公开接口可允许返回 null。Handler 和 Service 无需重复拆分 Authorization,直接使用 request.getBearerToken() 即可。

如果源码已有该方法,但业务工程编译提示找不到符号,需要重新构建并安装包含该方法的 tio-http-common,再重新编译业务工程;仅修改源码不会更新本地 Maven 仓库中的 JAR。

在 Handler 中校验参数 ​

nexus.io.tio.utils.validator.ParameterValidator 是无状态校验工具,不持有 HTTP 请求:

方法用途
text(value, name, max, required)检查字符串类型、去除首尾空白、必填与最大长度
id(value, name)校验正整数,支持十进制字符串与整数值
longValue(value, name, min, max, fallback)检查整数格式和范围;拒绝小数与溢出
choice(value, name, fallback, options...)检查枚举值
object(value, name)检查 Map 类型及字符串键;null 返回空 Map
array(value, name, max)检查 List 类型和元素数量;null 返回空 List
require(condition, message)检查附加的参数约束

校验失败抛出 java-model 的 nexus.io.model.exception.ParameterValidationException,建议在全局异常处理器中捕获并返回 HTTP 400。它不代表身份验证或业务权限检查:租户、对象归属、余额与状态变更仍应由拦截器和 Service 分别处理。

统一请求体大小配置 ​

http.max-request-body-size 为非 multipart 正文的字节上限,默认 0,表示沿用总请求上限。http.multipart.max-request-size 仍限制所有请求正文总大小;两者同时配置时,非 multipart 请求取较小值。multipart 上传沿用总请求与文件配置,不受普通正文上限影响。解码器在读取 Content-Length 时校验,在分配正文接收缓冲区前拒绝超限请求,无需在每个 Handler 中检查字符串长度。参数示例见 请求校验与响应转换。

HTTP 参数绑定为实体 ​

通过 request.getBodyObject(RequestType.class) 直接将 JSON 正文绑定为请求实体,已有查询或表单字段不会替代正文。动态 JSON 字段可绑定为 Kv,查询和表单字段通过 getRequestMap() 单独读取。字段必填与业务规则继续交给 ParameterValidator。用法及完整 import 示例见请求校验与响应转换。

判断请求媒体类型 ​

getContentType() 返回原始 Content-Type 头。需要判断媒体类型时,可以直接调用:

  • isContentType("application/json"):精确比较媒体类型,忽略大小写、首尾空白及请求头中的 charset、boundary 等参数。
  • isFormUrlEncoded():判断是否明确声明为 application/x-www-form-urlencoded。
  • isJson():判断是否明确声明为 application/json,支持 Application/JSON; charset=UTF-8 等写法。

缺少请求头时返回 false。isContentType() 的参数应为不带参数的媒体类型,传入 null 或空白返回 false;不支持通配符,也不会把 application/problem+json 当作 application/json。这些方法不修改请求头、不解析正文,也不改变框架原有的正文格式识别规则。缺少 Content-Type 时框架的默认表单解析行为,不等于请求明确声明了表单媒体类型。

java
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.utils.validator.ParameterValidator;

public class FormParameterValidator {
  public static void requireForm(HttpRequest request) {
    ParameterValidator.require(request.isFormUrlEncoded(),
        "Content-Type must be application/x-www-form-urlencoded");
  }
}

例如 Application/X-Www-Form-Urlencoded; charset=UTF-8 可以通过上述检查,multipart/form-data 则不会。业务接口可以复用这些方法表达自身接受的格式,无需反复拆分 Content-Type 字符串。

JSON 接口也可以使用相同方式限定请求格式,再通过 getBodyObject() 绑定请求实体。isJson() 只检查媒体类型,不检查正文是否为合法 JSON;application/problem+json 等类型需要使用 isContentType() 明确匹配。

java
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.utils.validator.ParameterValidator;

public class JsonParameterValidator {
  public static void requireJson(HttpRequest request) {
    ParameterValidator.require(request.isJson(),
        "Content-Type must be application/json");
  }
}

单值字符串参数:getRequestStringMap() ​

需要将查询和表单字段交给接收 Map<String, String> 的接口时,可以直接获取已解码的单值字符串参数:

java
import java.util.Map;
import nexus.io.tio.http.common.HttpRequest;

public class StringParameters {
  public Map<String, String> read(HttpRequest request) {
    return request.getRequestStringMap();
  }
}
  • 返回独立、可修改的 Map,修改结果不改变请求参数。
  • 每个名称必须恰有一个值;重复字段抛出 ParameterValidationException,包括名称 URL 解码后相同的字段。
  • 字符串保持原值,不 trim、不再次 URL 解码;null 值转换为空字符串。
  • 文件、数字及其他非字符串对象抛出 ParameterValidationException,不隐式调用 toString()。
  • 包含查询与已解码表单参数,不解析 JSON 正文;没有参数时返回空 Map。

getRequestMap() 适合普通参数读取,重复字段取首值;getRequestStringMap() 适合要求字段唯一的签名校验等场景。方法本身不限制 Content-Type,调用方按接口要求使用 isFormUrlEncoded() 等方法判断。普通业务接口由全局异常处理器捕获 ParameterValidationException 并返回 RespBodyVo,第三方通知则按对应协议返回回执。

MIT Licensed