Java 运行 cUrl Head 包含空格情况处理

Java 运行 cUrl

写了个脚本,需要用curl 请求网络,但是遇到 参数包含空格的情况, 参数如果包含空格,会导致 命令行无法执行。代码如下

fun cmd(vararg command: String): String {
    println(command)
    val runtime = Runtime.getRuntime()
    val process = runtime.exec(command)
    process.waitFor()
    // 输出 Shell 执行结果
    val out = process.inputStream.reader(Charsets.UTF_8).use {
        it.readText().replace("\n", "")
    }
    println("out: $out")
    return out
}


    val curl =
        """curl 'https://www.baidu.com' \
  -H 'accept: application/json, text/plain, */*' \
  -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' \
  -H 'authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzMDUiLCJleHAiOjE2NTg5MTgzNjksImlhdCI6MTY1NjMyNjM2OX0.ORkeXctRj92ZAxsucZtIwAXDfI4ROVzAI4na8ja5ys9QZeTYeCb7bgcCYto6dVV2COz1lssQEldVZzzik-zVxA' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'pragma: no-cache' \
  -H 'sec-fetch-dest: empty' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-site: same-site' \
  -H 'user-agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1' \
  --data-raw '{"ref":"refs/heads/release/9680","buildConfigs":[]}' \
  """

  	cmd(curl)

    //cmd("/bin/sh", "-c",curl)

类似上面的 比较复杂的cUrl 请求

因为 HEAD 参数里面含有 空格 会导致 直接执行

cmd(curl) 失败

原因是: runtime.exec(command) 里面的实现会根据空格 默认拆分全部的参数,这样导致 -H 后面的参数也被拆分掉了。

解决方法有以下几种

  1. 把所有参数 都手动拆分成 字符数组,然后调用 runtime.exec(command[]) 来执行,
    这种方式,比较繁琐,需要手动处理

网上 流传的 replace 空格的方法 是不行 的 cmd = cmd.replace(" ", “” “”);

  1. 直接构造出 shell 命令执行;

构造出sh 命令来执行

cmd(“/bin/sh”, “-c”,curl)

  1. 直接 搜索 curl convert Java 转成 Java函数执行,
    网上有现成的 转换网站,输入curl 会自动生成java 代码

比如: https://www.scrapingbee.com/curl-converter

fun req(){
    val url = URL("https://www.baidu.com")
    val httpConn: HttpURLConnection = url.openConnection() as HttpURLConnection
    httpConn.setRequestMethod("POST")

    httpConn.setRequestProperty("accept", "application/json, text/plain, */*")
    httpConn.setRequestProperty("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7")
    httpConn.setRequestProperty(
        "authorization",
        "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzMDUiLCJleHAiOjE2NTg5MTgzNjksImlhdCI6MTY1NjMyNjM2OX0.ORkeXctRj92ZAxsucZtIwAXDfI4ROVzAI4na8ja5ys9QZeTYeCb7bgcCYto6dVV2COz1lssQEldVZzzik-zVxA"
    )
    httpConn.setRequestProperty("cache-control", "no-cache")
    httpConn.setRequestProperty("content-type", "application/json")
    httpConn.setRequestProperty("pragma", "no-cache")
    httpConn.setRequestProperty("sec-fetch-dest", "empty")
    httpConn.setRequestProperty("sec-fetch-mode", "cors")
    httpConn.setRequestProperty("sec-fetch-site", "same-site")
    httpConn.setRequestProperty(
        "user-agent",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
    )

    httpConn.setDoOutput(true)
    val writer = OutputStreamWriter(httpConn.getOutputStream())
    writer.write("{\"ref\":\"refs/heads/release/9680\",\"buildConfigs\":[]}")
    writer.flush()
    writer.close()
    httpConn.getOutputStream().close()

    val responseStream: InputStream =
        if (httpConn.getResponseCode() / 100 === 2) httpConn.getInputStream() else httpConn.getErrorStream()
    val s = Scanner(responseStream).useDelimiter("\\A")
    val response = if (s.hasNext()) s.next() else ""
    println(response)
}

个人推荐 简单用 第二种, 如果经常使用 用第三种

ps: curl 可以通过 Chrome dev Tool 直接copy出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值