Skip to content

接收请求参数 ​

get 获取参数 ​

@RequestPath(value = "/get")
public HttpResponse get(String before, String end, HttpRequest request) throws Exception {
  HttpResponse ret = Resps.html(request, "before:" + before + "<br>end:" + end);
  return ret;
}

这段代码定义了一个名为 get 的方法,通过 @RequestPath 注解映射到 URL 路径 /get。方法接收两个字符串参数 before 和 end,以及一个 HttpRequest 对象 request。

Post 获取参数 ​

  @RequestPath(value = "/post")
  public HttpResponse post(String before, String end, User user, Short shortid, HttpRequest request) throws Exception {
    HttpResponse ret = Resps.html(request, "before:" + before + "<br>end:" + end + "<br>user:<pre>" + Json.toFormatedJson(user) + "</pre>");
    return ret;
  }

这段代码定义了一个名为 post 的方法,通过 @RequestPath 注解映射到 /post URL 路径。这个方法接收几个参数:两个字符串 before 和 end,一个 User 对象 user,一个 Short 类型的 shortid,以及一个 HttpRequest 对象 request。

这个方法的主要功能是接收 HTTP POST 请求,获取其中的参数和用户对象,并将这些信息以 HTML 格式的响应返回。

从请求地址中获取参数 ​

示例代码

@RequestPath(value = "/var/{name}/{id}")
public HttpResponse var(String name, String id, HttpRequest request) throws Exception {
  HttpResponse ret = Resps.json(request, "name:" + name + "\r\n" + "id:" + id);
  return ret;
}

这段代码定义了一个处理 HTTP 请求的方法 var,该方法映射到一个 URL 路径模式 /var/{name}/{id}。这里的 {name} 和 {id} 是路径变量,它们在 URL 中动态替换成实际的值。方法接收两个字符串参数 name 和 id,这些参数自动从匹配的 URL 中提取。还有一个 HttpRequest 参数,代表接收到的 HTTP 请求。

方法的主体创建并返回一个 HttpResponse 对象,其中包含 name 和 id 的值。通过 Resps.json 方法生成响应,它将 name 和 id 的值格式化为 JSON 格式的字符串。这样,当访问对应的 URL 时,此方法将以 JSON 格式返回提取的 name 和 id 参数值。

URL 编码的参数名与重复参数 ​

查询字符串及 application/x-www-form-urlencoded 表单由框架统一解码,参数名和参数值都使用请求字符集进行 URL 解码。业务 Handler 直接读取解码后的名称,不必再调用 URLDecoder,避免二次解码。

传入片段解码结果
%69d=one&id=two同一个 id 参数的两个值,按请求顺序保留
first+name=hello+world名称 first name,值 hello world
%E5%90%8D=%E5%80%BC名称“名”,值“值”
x%3Dy=a%3Db名称 x=y,值 a=b

重复参数可从 request.getParams().get("id") 获取数组;不要只读取单值后假定客户端没有提交其他同名值。名称或值中的非法百分号编码会进入请求解码错误处理。

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

public class ParameterNameHandler {
  public HttpResponse handle(HttpRequest request) {
    String value = request.getParam("first name");
    return TioRequestContext.getResponse().respond(RespBodyVo.ok(value));
  }
}

程序追加参数与类型保留 ​

request.addParam(name, value) 按调用顺序追加同名参数,支持字符串、UploadFile 以及其他 Java 对象。纯字符串参数保留 String[] 类型,纯文件参数保留 UploadFile[] 类型;混合类型使用 Object[],便于完整保留同名字段的不同值。

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

public class ParameterEnrichment {
  public Object[] addInternalValues(HttpRequest request) {
    request.addParam("internal-value", Integer.valueOf(42));
    request.addParam("internal-value", "label");
    return request.getParamArray("internal-value");
  }
}

示例结果依次包含 Integer 值 42 和字符串 label。getObject 读取第一个对象,getParamArray 读取完整数组。字符串字段可用 getParam 或 getParamValues,文件字段可用 getUploadFile;混合字段应通过对象接口读取,再按业务约定检查类型。

程序调用 addParam(name, null) 保持不追加的行为。查询字符串和表单的解码追加也保留已有值与顺序,普通对象不会自动转换为字符串。框架按 Content-Type 完成请求解析,Handler 无需另写一套表单解码逻辑。

Content-Type 的区域无关识别 ​

框架使用固定大小写规则识别 Content-Type,与 JVM 默认语言区域无关。application/json 及其大写形式进入相同的文本处理流程;multipart/form-data 的大小写形式也遵循相同分类,便于在不同部署区域保持一致的请求解析行为。

HTTP 首部属性 ​

HttpParseUtils.getSubAttribute 按完整属性名称匹配,名称不区分大小写,允许等号两侧留空白,属性值保持原始大小写。带引号的值支持分号及反斜杠转义,适合解析 Content-Type 的 boundary、charset 与 Content-Disposition 的 name、filename。缺少属性或引号未闭合时返回 null。

java
import nexus.io.tio.http.common.utils.HttpParseUtils;

public class HeaderAttributeExample {
  public String uploadField() {
    String header = "form-data; filename=photo.png; name=upload";
    return HttpParseUtils.getSubAttribute(header, "name");
  }

  public String multipartBoundary() {
    return HttpParseUtils.getSubAttribute("multipart/form-data; BOUNDARY = AbCd", "boundary");
  }
}

示例分别返回 upload 与 AbCd。框架的 multipart 和字符集解析复用该方法,业务处理器通常可以直接使用框架已经解析的请求参数。

MIT Licensed