当前位置: 首页 > 知识库问答 >
问题:

使用Runtime.getRuntime在kotlin中提交请求。执行数据错误

甄佐
2023-03-14

我正在 intellij 中构建一个插件,并希望提出 curl 请求。该插件是用kotlin编写的。

以下curl请求有效:

            val comd = arrayOf(
                "curl",
                "-X",
                "GET",
                "-H",
                "Authorization: AUTH_TOKEN",
                "https://api.bitrise.io/v0.1/me"
            )

但以下带有数据的POST请求没有:

            val comd = arrayOf(
                "curl",
                "-X",
                "POST",
                "https://api.bitrise.io/v0.1/apps/appslug/builds",
                "-H",
                "Authorization: AUTH_TOKEN",
                " -d $data"
            )

我正在使用这个函数来运行请求:

    private fun executeCommandLine(project: Project, comd: Array<String>) {
        val process = Runtime.getRuntime().exec(comd)
        val processHandler: ProcessHandler = OSProcessHandler(process, "clear", Charset.forName("UTF-8"))
        consoleView.attachToProcess(processHandler)
        processHandler.startNotify()
    }

它只是抛出一个错误:

curl: (3) nested brace in URL position 18:
 -d {"hook_info":{"type":"bitrise"},"build_params":{"branch":"master"}}

我已尝试使用-g开关运行请求以查找全局错误。但后来我遇到了另一个:

curl: (3) URL using bad/illegal format or missing URL

我在这里错过了什么?

PS:我不得不将 curl 命令分解为数组,否则它不起作用。检查:无法通过 java Runtime.getRuntime().exec() 执行 CURL 命令

提前致谢 :)

共有1个答案

郤浩慨
2023-03-14

将 curl 命令返回到字符串,然后尝试从@leondepeon的答案中使用此函数

    /** Run a system-level command.
 * Note: This is a system independent java exec (e.g. | doesn't work). For shell: prefix with "bash -c"
 * Inputting the string in stdIn (if any), and returning stdout and stderr as a string. */
fun exec(cmd: String, stdIn: String = "", captureOutput:Boolean = false, workingDir: File = File(".")): String? {
    try {
        val process = ProcessBuilder(*cmd.split("\\s".toRegex()).toTypedArray())
                .directory(workingDir)
                .redirectOutput(if (captureOutput) ProcessBuilder.Redirect.PIPE else ProcessBuilder.Redirect.INHERIT)
                .redirectError(if (captureOutput) ProcessBuilder.Redirect.PIPE else ProcessBuilder.Redirect.INHERIT)
                .start().apply {
                    if (stdIn != "") {
                        outputStream.bufferedWriter().apply {
                            write(stdIn)
                            flush()
                            close()
                        }
                    }
                    waitFor(60, TimeUnit.SECONDS)
                }
        if (captureOutput) {
            return process.inputStream.bufferedReader().readText()
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return null
}

另外,如果在Windows上工作,请警惕单引号。

 类似资料:
  • 当我在symfony4中提交json http post请求时,requesthandling不会提交我的表单。 我尝试将“方法”选项设置为要发布的表单,但似乎没有帮助。我将application/json头用于Content-type和Accept。 表格: 控制器: 还有我的http帖子: 标头:内容类型:应用程序/json接受:应用程序/json 正文:{“用户名”:“dunglas”} 我

  • 我试图对我写的rest api执行一个put请求,但它总是返回400-bug请求。 java.io.IO异常:服务器返回HTTP响应代码:400为URL:http://localhost:8000/api/v0/contacts/2sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知来源) 我可以用firefox rest客户端

  • 问题内容: 此代码将执行一个外部exe应用程序。 如果我想执行外部Java文件怎么办?可能吗?例如以下命令: 该代码在java和cmd提示符下不起作用。如何解决呢? 问题答案: 首先,您的命令行看起来不正确。执行命令与批处理文件不同,它不会执行一系列命令,而只会执行一个命令。 从外观上看,您正在尝试更改要执行的命令的工作目录。一个更简单的解决方案是使用,它将允许您指定给定命令的起始目录… 例如…

  • 本文向大家介绍.NET的Ajax请求数据提交实例,包括了.NET的Ajax请求数据提交实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了.NET的Ajax请求数据提交实现方法。分享给大家供大家参考。具体如下: 控制器 希望本文所述对大家的.NET程序设计有所帮助。

  • 问题内容: 我是Liferay门户网站的新手。我已经在liferay中开发了一个portlet进行演示。在此示例中,我使用了portlet间的通信。我正在做的是:-我有一个搜索portlet,其中有一个要搜索的文本字段。当我单击搜索按钮时,它将从数据库中获取数据,并使用另一个portlet中包含的搜索显示该数据。我为此项目使用了ProcessEvent和ActionEvent批注。 现在我想要的是

  • 问题内容: 在我正在处理的项目中,我需要执行资源文件夹(位于类路径中)中的脚本。我只是在测试最终的脚本功能,因为我在Windows上,所以我需要一种将文件输出到STDIN的方法,因此我创建了一个简单的cat.jar程序来克隆unixs cat命令。 因此,当我执行“ java -jar cat.jar someFile.txt”时,它将输出文件到stdout。我敢肯定,我做的事情有不同的方式。 无