当前位置: 首页 > 面试题库 >

Groovy / Jenkins-如何在http请求正文中使用for循环

郗鹏
2023-03-14
问题内容

我正在尝试动态读取数组(每个元素是一个字符串),并使用这些字符串值替换当前的硬编码用户名。这是用于在Bitbucket中创建拉取请求。

下面的#1和#2都属于同一类BitbucketUtil.groovy

    def createPullRequest(projectSlug, repoSlug, title, description, sourceBranch, targetBranch) {
    //this is reading in the array with the user names
    def names = BitbutkcetUtil.getGroupUsers(teamName, activeOnly)

            def prResponse = this.steps.httpRequest(
                    acceptType: 'APPLICATION_JSON',
                    authentication: this.userId,
                    contentType: 'APPLICATION_JSON',
                    httpMode: 'POST',
                    ignoreSslErrors: true,
                    quiet: true,
                    requestBody: """
                                {
                                    "title": "${title}",
                                    "description": "${description}",
                                    "state": "OPEN",
                                    "open": true,
                                    "closed": false,
                                    "fromRef": { "id": "${sourceBranch}" },
                                    "toRef": { "id": "${targetBranch}" },
                                    "locked": false,
                                    "reviewers": [
                                        //I want to replace this hardcoded names with the string values inside the array `names`
                                        { "user": { "name": "HardCoded1" } },
                                        { "user": { "name": "HardCoded2" } },
                                        { "user": { "name": "HardCoded3" } },
                                        { "user": { "name": "HardCoded4" } }
                                    ]
                                }
                            """,
                    responseHandle: 'STRING',
                    url: "https://bitbucket.absolute.com/rest/api/latest/projects/${projectSlug}/repos/${repoSlug}/pull-requests",
                    validResponseCodes: '200:299')
            def pullRequest = this.steps.readJSON(text: prResponse.content)
            prResponse.close()
            return pullRequest['id']
        }

2:

   def getGroupUsers(groupName, activeOnly) {
        def getUsersResponse = this.steps.httpRequest(
                acceptType: 'APPLICATION_JSON',
                authentication: this.userId,
                ignoreSslErrors: true,
                quiet: true,
                responseHandle: 'STRING',
                url: "https://bitbucket.absolute.com/rest/api/latest/admin/groups/more-members?context=pd-teamthunderbird",
                validResponseCodes: '200:299')
        def usersPayload = this.steps.readJSON(text: getUsersResponse.content)['values']
        getUsersResponse.close()
        def users = []
        usersPayload.each { user ->
            if (!activeOnly || (activeOnly && user['active'])) {
                users.add(user['name'])
            }
        }
        return users
        //this is returning an array with string elements inside
    }

我猜想使用该函数getGroupUsersgroupName参数为teamName),我可以替换函数"reviewers"内部的硬编码字符串createPullRequest。但是我不确定如何在“审阅者”下使用for循环,以便可以动态地输入值:

 "reviewers": [
                                    //I want to replace this hardcoded names with the string values inside the array `names`
                                    { "user": { "name": "HardCoded1" } },
                                    { "user": { "name": "HardCoded2" } },
                                    { "user": { "name": "HardCoded3" } },
                                    { "user": { "name": "HardCoded4" } }
                                ]
                            }

任何帮助将不胜感激。


问题答案:

如果定义了您的姓名,并且您的最终目标是在其中包含所有名称的地方创建一个地图列表,那么您可以仅从collect名称中选择地图。例如

def names = ["HardCoded1", "HardCoded2"]
println([reviewers: names.collect{ [user: [name: it]] }])
// => [reviewers:[[user:[name:HardCoded1]], [user:[name:HardCoded2]]]]

如果您的目标是创建JSON正文,请不要连接字符串。使用Groovy提供的功能来创建JSON。例如

groovy.json.JsonOutput.toJson([
    title: title,
    state: "OPEN",
    reviewers: names.collect{ [user: [name: it]] }],
    // ...
])


 类似资料:
  • 问题内容: 我需要能够在我们的Jenkins Pipeline构建过程中创建简单的HTTP POST请求。但是,我不能使用简单的curl sh脚本,因为我需要它在Windows和Linux节点上工作,并且如果可以避免的话,我不希望在节点上执行更多的工具安装。 我们正在使用的Pipeline插件中使用的Groovy库对于此任务应该是完美的。Groovy有一个扩展名,可以执行简单的POST,称为htt

  • 我需要能够在我们的Jenkins管道构建期间创建简单的HTTP POST请求。但是我不能使用简单的curl sh脚本,因为我需要它在Windows和Linux节点上工作,如果我可以避免的话,我不希望在节点上强制安装更多的工具。 我们正在使用的管道插件中使用的Groovy库应该非常适合此任务。Groovy有一个扩展来执行简单的POST,称为http builder,但我一生都无法在Jenkins的G

  • 问题内容: 我想知道为什么当我这样依次调用request.get()方法时: 我对所有请求的状态都良好,但是当我在for循环中执行该状态时,例如: 除最后一个请求外,所有请求我都得到400(错误)。 附加信息:SO上有一个相关的问题,其中提到了两种应对这种情况的方法:等待,标题。 在我的情况下 以及标题中,wait不起作用-我不知道在那里提供了什么。 更新:我正在尝试实现的特定版本: 问题答案:

  • 本文向大家介绍在SAP Business One中,使用SOAP正文进行HTTP请求,包括了在SAP Business One中,使用SOAP正文进行HTTP请求的使用技巧和注意事项,需要的朋友参考一下 您可以使用SAP提供的Web服务包装程序,从而使程序员可以使用DIS提供的服务。为了执行简单的集成,可以在开放源代码版本中使用SoapUI。使用登录服务执行连接,并参考其wsdl,可以创建登录请求

  • 问题内容: 我找到了我想免费玩的API。我想问一下是否要使用API​​开发Android应用,并且该API基于HTTP协议(RESTful),如何使用 HTTPClient 对象来实现? 我有一般要求的信息。 以上的回应将是成功的话。 我知道如何使用HTTPClient发送HTTP请求,但是否向请求中添加了额外的标头和其他不必要的内容?如何查看HTTPClient对象发出的请求?我只想简单地请求像

  • 问题内容: 我正在向本地部署并使用JAVA Spark创建的本地服务发出POST请求。 我想使用进行POST调用时在请求正文中发送一些数据,但是每次JAVA Spark中的请求正文为null时。 下面是我为此使用的代码 Java Spark POST服务处理程序 HTTPClass进行POST调用 问题答案: 您应该仅在将参数写入主体后才调用,而不是之前。您的代码应如下所示: