關於Content-Type: multipart/form-data的支持


關於Content-Type: multipart/form-data的支持
 發布於 537天前  作者  yzhang226  303 次瀏覽   復制   上一個帖子   下一個帖子
 標簽: 無

今天使用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"

請問有辦法支持?

16 回復

加了@AdpateBy注解沒?

@wendal 加哪一個AdpateBy??

@yzhang226

@AdapteBy(type=UploadAdapter.class)

@wendal 真的可以✌, 請問能否加兩種AdapteBy, 支持兩種呢? 我還想支持application/x-www-form-urlencoded, 主要是以前用spring沒有這個限制

@yzhang226 有,叫WhaleAdapter

@wendal 說錯,Whale是支持3種,普通表單,json,文件上傳

UploadAdapter同時支持普通和文件上傳的

越說越亂。。。。

用Whale就是了

@wendal

	@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 真的而是萬分感謝, 完美解決了我的問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM