【问题标题】:HTTPBuilder and MultipartEntity / multipart form-data in GroovyGroovy 中的 HTTPBuilder 和 MultipartEntity / 多部分表单数据
【发布时间】:2023-04-06 14:05:01
【问题描述】:

试图模拟需要将一些 INPUT/TEXT 字段与文件中的数据结合起来的 HTTP POST。看起来我可以有一个或另一个,但不能同时拥有?

在下面的 sn-p 中,paramsToPost = [name: 'John', age:22]

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.0')
Boolean doHttpPost(String url, Map paramsToPost, String fileContent) {
    HTTPBuilder http = new HTTPBuilder(url)
    def resp = http.request(Method.POST ) { req ->
        MultipartEntity mpe = new MultipartEntity()
        mpe.addPart "foo", new StringBody(fileContent)
        req.entity = mpe

        // body = paramsToPost // no such property
    }

    println "response: ${resp}"

    return true
}

请问有人有工作样本吗?

【问题讨论】:

    标签: http post groovy multipartform-data httpbuilder


    【解决方案1】:

    刚刚让我的代码与旧的 commons-httpclient-3.1.jar 一起工作

     (new HTTPBuilder(url)).request(Method.POST) { request ->
    MultipartEntity mpe = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    mpe.addPart('fileInput', new StringBody(params.fileInput))
    if (params.fileInput=='file')
        mpe.addPart('file1', new InputStreamBody(uploadedFile.inputStream, uploadedFile.contentType, uploadedFile.originalFilename))
    else if (params.fileInput=='text')
        mpe.addPart('fileText', new StringBody(params.fileText))
    mpe.addPart('tags1', new StringBody(params.tags1)) 
    request.entity = mpe
    request.getParams().setParameter("http.connection.timeout", HTTP_TIMEOUT)
    request.getParams().setParameter("http.socket.timeout", HTTP_TIMEOUT)
    response.success = { resp, reader ->
        render(text : "Successfully uploaded file\n\n${reader.text}")
    }
    response.failure = { resp ->
      render (status: 500, text: "HTTP Failure Accessing Upload Service ${resp.statusLine}" )
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:
      def postMultipartForm(String uri,
                            File file,
                            String filePartName,
                            Map<String, String> textFields = [:],
                            Map<String, String> httpHeaders = [:]) {
          MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create()
                  .addPart(filePartName, new FileBody(file, ContentType.APPLICATION_XML.withCharset(StandardCharsets.UTF_8)))
          textFields.each { n, v -> entityBuilder.addTextBody(n, v) }
      
          final expectedResponseContentType = ContentType.ANY
          return new HTTPBuilder().request(uri, Method.POST, expectedResponseContentType) { HttpEntityEnclosingRequest req ->
              req.entity = entityBuilder.build()
              httpHeaders.each { h, v ->
                  req.addHeader(h, v)
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        对于寻找答案的其他人,请使用 HTTPBuilder 的这个分支。

        https://github.com/berngp/httpbuilder/tree/branch%2Fadd%2FMultiPart-Form

        在某个时候,我希望它会被合并到主分支中。

        【讨论】:

          猜你喜欢
          • 2014-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多