首页 > 解决方案 > Jenkins http请求无法识别文件名

问题描述

我认为这个请求失败是因为它无法识别文件名。使用此HTTP 请求插件并在声明性管道中遵循此API 文档,我运行了以下请求...

script {
       env.WORKSPACE = pwd()
       
       def response = httpRequest url: "https://cloud.tenable.com/compliance/export", 
           customHeaders: [[name: 'X-ApiKeys', value: "${ACCESS_KEY}"]],
           httpMode: 'POST',
           acceptType: 'APPLICATION_JSON',
           uploadFile: "${env.WORKSPACE}/test.zip"
         }        

错误:

java.lang.IllegalStateException: Name is blank
11:02:40    at org.apache.http.util.Asserts.notBlank(Asserts.java:64)
11:02:40    at org.apache.http.entity.mime.FormBodyPartBuilder.build(FormBodyPartBuilder.java:96)
11:02:40    at org.apache.http.entity.mime.MultipartEntityBuilder.addPart(MultipartEntityBuilder.java:148)
11:02:40    at jenkins.plugins.http_request.HttpRequestExecution.authAndRequest(HttpRequestExecution.java:314)
11:02:40    at jenkins.plugins.http_request.HttpRequestExecution.call(HttpRequestExecution.java:260)
11:02:40    at jenkins.plugins.http_request.HttpRequestExecution.call(HttpRequestExecution.java:80)
11:02:40    at hudson.remoting.LocalChannel.call(LocalChannel.java:46)
11:02:40    at jenkins.plugins.http_request.HttpRequestStep$Execution.run(HttpRequestStep.java:380)
11:02:40    at jenkins.plugins.http_request.HttpRequestStep$Execution.run(HttpRequestStep.java:358)
11:02:40    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
11:02:40    at hudson.security.ACL.impersonate2(ACL.java:449)
11:02:40    at hudson.security.ACL.impersonate(ACL.java:461)
11:02:40    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44)
11:02:40    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
11:02:40    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
11:02:40    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
11:02:40    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
11:02:40    at java.lang.Thread.run(Thread.java:748)

我相信这与java 文档中的 addFile 方法有关吗?将 contentType 指定为 APPLICATION_ZIP 或 APPLICATION_OCTETSTREAM 会导致相同的错误。用不存在的文件替换 test.zip 会将错误更改为“文件不存在”,这向我表明正在读取 test.zip,但“名称”参数不知何故为空白。

标签: httpjenkinsjenkins-declarative-pipeline

解决方案


显然你必须设置multipartName

httpRequest url: "https://cloud.tenable.com/compliance/export", 
    customHeaders: [[name: 'X-ApiKeys', value: "${ACCESS_KEY}"]],
    httpMode: 'POST',
    acceptType: 'APPLICATION_JSON',
    uploadFile: "test.zip", // env.WORKSPACE is not necessary, the path is already relative to the current workspace 
    multipartName: "something" // <--

(我相信这设置了与文件关联的 HTML 表单字段的名称。对于 REST API,我猜这个值无关紧要。)


或者,如果您的服务器支持它,您也可以设置wrapAsMultipart为 false,这样文件就不会被包装,multipart/form-data而是直接在请求正文中发送。


推荐阅读