关于Content-Type: multipart/form-data的支持

Posted 疯子加天才

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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 真的而是万分感谢, 完美解决了我的问题

以上是关于关于Content-Type: multipart/form-data的支持的主要内容,如果未能解决你的问题,请参考以下文章

关于 Content-Type:application/x-www-form-urlencoded 和 Content-Type:multipart/related(转)

关于Content-Type中application/x-www-form-urlencoded 和 multipart/form-data的区别及用法

fetch 关于七牛的content-type 的问题

使用 Content-Type 发出 Alamofire 请求:multipart/form-data

批处理请求必须具有“Content-Type”标头/“multipart/mixed”作为媒体类型

Jmeter content-type:multipart/form-data温故