今天使用postman測試, 發現multipart/form-data的參數不支持,
postman的數據如下:
POST /dada-log-api/v1/logging/line HTTP/1.1
Host: 127.0.0.1:8380
Verification-Hash: casa
Cache-Control: no-cache
Postman-Token: 719df17f-c105-d42d-411c-876d3345c3fe
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="topic"
xx
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="logLine"
請問有辦法支持?
@wendal 加哪一個AdpateBy??
@wendal 真的可以✌, 請問能否加兩種AdapteBy, 支持兩種呢? 我還想支持application/x-www-form-urlencoded, 主要是以前用spring沒有這個限制
@yzhang226 有,叫WhaleAdapter
@wendal 說錯,Whale是支持3種,普通表單,json,文件上傳
UploadAdapter同時支持普通和文件上傳的
@At("/line")
@POST
@Ok("json")
@AdaptBy(type=WhaleAdaptor.class)
public RawRespone<Integer> logLine(@Param("topic") String topic,
@Param("logLine") List<String> logLines,
HttpServletRequest req) {
multipart/form-data是可以了, 但是application/x-www-form-urlencoded參數為null
@yzhang226 debug一下Whale,理應會判斷的
@wendal application/x-www-form-urlencoded時, req.getParameterMap()
有數據, 但是沒有注入
@wendal
adptor代碼沒有urlencoded的判斷
String type = req.getHeader("Content-Type");
if (!Strings.isBlank(type)) {
if (type.contains("json")) { // JSON適配器
try {
return Json.fromJson(req.getReader());
} catch (Exception e) {
throw Lang.wrapThrow(e);
}
}
if (type.contains("multipart/form-data")) { // 上傳適配器
FastUploading uploading = new FastUploading();
try {
return uploading.parse(req, uploadCtx);
} catch (UploadException e) {
throw Lang.wrapThrow(e);
}
}
}
return super.getReferObject(sc, req, resp, pathArgs);
- @wendal
@Param("logLine") List<String> logLines
這個是list, 是不是不能注入?Map<String, String[]> params = req.getParameterMap();
是有logLine的參數數據的
用數組
@Ok("json")
@At("/whale/test")
@AdaptBy(type=WhaleAdaptor.class)
public Object whaleInput(@Param("lines")String[] lines) {
return lines;
}
@wendal 換成數組之后確實可以了, 我有兩個疑問:
為什么默認適配器不用Whale?
List為什么在這種情況下不能適配?而在form-data下list是可以的?
謝謝
WhaleAdaptor里面有個判斷沒做好, 還需要根據泛型判斷一下:
if (List.class.isAssignableFrom(clazz))
return new MapListInjector(paramName);
至於為啥默認不是WhaleAdaptor,那是怕任何接口都能做文件上傳了. 不過, 自行在MainModule設置為WhaleAdaptor,也就變成默認的了.
@wendal 真的而是萬分感謝, 完美解決了我的問題