zoukankan      html  css  js  c++  java
  • 关于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 真的而是万分感谢, 完美解决了我的问题

  • 相关阅读:
    Oracle,第六周
    JAVA创建对象的几种方式
    深拷贝和浅拷贝
    Facade
    Adapter
    低谷过去了
    Oracle,第五周
    Command
    Singleton
    mybatis自动生成mapping和实体
  • 原文地址:https://www.cnblogs.com/telwanggs/p/7803540.html
Copyright © 2011-2022 走看看