接收请求参数
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") 获取数组;不要只读取单值后假定客户端没有提交其他同名值。名称或值中的非法百分号编码会进入请求解码错误处理。
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[],便于完整保留同名字段的不同值。
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。
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 和字符集解析复用该方法,业务处理器通常可以直接使用框架已经解析的请求参数。
