【问题标题】:Groovy Script Send Multipart Request to Grails Web App for testGroovy 脚本向 Grails Web App 发送多部分请求以进行测试
【发布时间】:2014-10-15 08:38:54
【问题描述】:

我正在尝试通过从 gradle 构建的独立 groovy 测试脚本创建和发送多部分请求来测试我的 Grails Web 应用程序。但我很挣扎。

  • 我无法附加自定义 Content-ID 标头
  • 我无法附加运行时创建的随机字节文件(我可以附加现有文件,但我需要许多不同大小的随机文件)

编辑(感谢至强):

  • 我的脚本现在正在发送一个有效的多部分请求,但由于某种原因,我的 grails Web 应用程序不接受除“Content-Type”之外的任何标头。

这是我的代码:

独立测试脚本代码:

void sendMultipartRequest(String url) {
    HTTPBuilder httpBuilder = new HTTPBuilder(url)
    httpBuilder.request(Method.POST){ req ->

        MultipartEntityBuilder entityBuilder = new MultipartEntityBuilder()
        entityBuilder.setBoundary("----boundary")

        entityBuilder.setMode(HttpMultipartMode.RFC6532)

        String randomString = myGenerateRandomStringMethod()
        FormBodyPart formBodyPart = new FormBodyPart(
            "SOME_NAME", 
            new InputStreamBody(new ByteArrayInputStream(randomString.bytes), "attachment", "SOME_NAME")
        )
        formBodyPart.addField("Content-ID", "abc123")
        entityBuilder.addPart(formBodyPart)

        response.success = { resp ->
            println("Success with response ${resp.toString()}")
        }
        response.failure = { resp ->
            println("Failure with response ${resp.toString()}")
        }

        delegate.setHeaders(["Content-Type":"multipart/related; boundary=----boundary"])
        req.setEntity(entityBuilder.build())
    }
}

控制器中用于处理帖子的 Grails Web 应用端:

def submitFiles() {
    if(request instanceof MultipartHttpServletRequest){
        HashMap<String, Byte[]> fileMap = extractMultipartFiles(request)
        someService.doStuffWith(fileMap)
    }
}
private HashMap<String, Byte[]> extractMultipartFiles(MultipartHttpServletRequest multipartRequest) {
    HashMap<String, Byte[]> files = new HashMap<>()
    for(element in mulipartRequest.multiFileMap){
        MultipartFile file = element.value.first()
        String contentId = multipartRequest.getMultipartHeaders(element.key).get("Content-ID")?.first()
        if(contentId) files.put(contentId, file.getBytes())
    }
    return files
}

我正在使用的库:

ext {
    groovyVersion = "2.3.4"
    commonsLangVersion = "2.6"
    httpBuilderVersion = "0.7.1"
    httpmimeVersion = "4.3.4"
    junitVersion = "4.11"
}
dependencies {
    compile "org.codehaus.groovy:groovy-all:${groovyVersion}"
    compile "commons-lang:commons-lang:${commonsLangVersion}"
    compile "org.codehaus.groovy.modules.http-builder:http-builder:${httpBuilderVersion}"
    compile "org.apache.httpcomponents:httpmime:${httpmimeVersion}"
    testCompile group: 'junit', name: 'junit', version: "${junitVersion}"
} 

【问题讨论】:

    标签: grails groovy gradle multipart


    【解决方案1】:

    你总是可以使用ContentBody接口的一些子类:

    FormBodyPart(String name, ContentBody body) 
    

    例如使用:InputStreamBody:

    new FormBodyPart("name", new InputStreamBody(new RandomInputStream(...)), ContentType.MULTIPART_FORM_DATA);
    

    您可以使用:RandomInputStream 类。

    你可能会使用标题:HTTPBuilder$RequestConfigDelegate.setHeaders(Map headers),因为它被设置为内部闭包的委托。

    【讨论】:

    • 谢谢!!!我没有可用的 RandomInputStream,所以我使用的是:new FormBodyPart("name", new InputStreamBody(new ByteArrayInputStream(randomString.bytes), "attachment", "name"))。这会将字符串添加为附件而不是参数。
    • 我不太清楚如何使用 RequestConfigDelegate,你能举个例子吗?看起来 RequestConfigDelegate 是 HTTPBuilder 的一个静态子类,但是我将如何使用它设置单个多部分文件的标头?
    • @SnoopDougg 据我所知它是一个委托并且该方法是公开的 - 所以您应该能够直接调用它或通过delegate.setHeaders() 调用它。
    • 谢谢!不幸的是,它仍然对我不起作用:(我已经用 EDIT 更新了我上面的问题,以显示我尝试过的内容......
    • 我想我找到了问题 - MultipartEntityBuilder.build() 的 Content-Type 默认设置为“multipart/form-data”。但是为了包含 Content-ID 标头,帖子的 Content-Type 必须是“多部分/相关”...不幸的是,我还没有找到一种方法来做到这一点...任何建议?
    【解决方案2】:

    我过去曾使用 curl 进行此测试:

    curl -v -F "param1=1" -F "param2=99" -F "fileparam=@somefile.flv;type=video/x-flv" http://localhost:8080/someapp/sessions
    

    somefile.flv 在当前目录中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 2018-01-06
      • 2021-11-01
      相关资源
      最近更新 更多