使用 Copy as Curl 的注意事项

1,142 阅读4分钟

记录下在实现一个在线的翻译程序时遇到的一些问题。 curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。但是,在有些时候需要使用浏览器生成的 curl 命令,在命令行中运行时会出现一些问题。下面就记录一些可能会遇到的问题吧。

一. 可能出现的错误

  1. 通过 Copy as Curl 的方法获取一个网页的翻译请求 curl 命令,然后放到命令行中去执行。比如在如下网站 fanyi.caiyunapp.com/#/ 获取一个单词的翻译,然后在 "检查" 中找到 NetWork 下的 dict 请求,并右击选择 "Copy as Curl" 来获取相应命令。

image.png

可能获取的命令如下:

curl "https://api.interpreter.caiyunai.com/v1/dict" ^
  -H "authority: api.interpreter.caiyunai.com" ^
  -H "accept: application/json, text/plain, */*" ^
  -H "accept-language: zh-CN,zh;q=0.9" ^
  -H "app-name: xy" ^
  -H "content-type: application/json;charset=UTF-8" ^
  -H "device-id: 71f8a02a4a4c970d3ddbbe2479c6183b" ^
  -H "origin: https://fanyi.caiyunapp.com" ^
  -H "os-type: web" ^
  -H "os-version;" ^
  -H "referer: https://fanyi.caiyunapp.com/" ^
  -H "sec-ch-ua: ^\^"Chromium^\^";v=^\^"112^\^", ^\^"Google Chrome^\^";v=^\^"112^\^", ^\^"Not:A-Brand^\^";v=^\^"99^\^"" ^
  -H "sec-ch-ua-mobile: ?0" ^
  -H "sec-ch-ua-platform: ^\^"Windows^\^"" ^
  -H "sec-fetch-dest: empty" ^
  -H "sec-fetch-mode: cors" ^
  -H "sec-fetch-site: cross-site" ^
  -H "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36" ^
  -H "x-authorization: token:qgemv4jr1y38jyq6vhvi" ^
  --data-raw "^{^\^"trans_type^\^":^\^"en2zh^\^",^\^"source^\^":^\^"payload^\^"^}" ^
  --compressed
  1. 在终端中复制运行此 curl 命令,可能会出现如下错误

    (1) 命令格式错误

image.png

      (2) 请求方法错误

image.png

     (3) 版本不支持错误

image.png

二. 解决方案

1.命令格式修改

在 Windows 系统的命令提示符中,'^' 符号用于表示命令的换行续行,但在某些情况下,可能会导致问题。可能会引发不能被正确解析。可以将整个命令放在一行,避免编译解析出错的问题,然后需要换行的地方手动添加换行符,避免 '^' 符号引起的问题。如下将命令放入一行中:

curl "https://api.interpreter.caiyunai.com/v1/dict" -X POST -H "authority: api.interpreter.caiyunai.com" -H "accept: application/json, text/plain, */*" -H "accept-language: zh-CN,zh;q=0.9" -H "app-name: xy" -H "content-type: application/json;charset=UTF-8" -H "device-id: 71f8a02a4a4c970d3ddbbe2479c6183b" -H "origin: https://fanyi.caiyunapp.com" -H "os-type: web" -H "os-version;" -H "referer: https://fanyi.caiyunapp.com/" -H "sec-ch-ua: \"Chromium\";v=\"112\", \"Google Chrome\";v=\"112\", \"Not:A-Brand\";v=\"99\"" -H "sec-ch-ua-mobile: ?0" -H "sec-ch-ua-platform: \"Windows\"" -H "sec-fetch-dest: empty" -H "sec-fetch-mode: cors" -H "sec-fetch-site: cross-site" -H "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36" -H "x-authorization: token:qgemv4jr1y38jyq6vhvi" --data-raw "{\"trans_type\":\"en2zh\",\"source\":\"payload\"}" --compressed

另一种放式就是使用一个文本编辑器,将每行命令中间出现的 '^' 去掉,只保留最后的 '^' 即可。代码如下所示:

curl "https://api.interpreter.caiyunai.com/v1/dict" ^
  -H "authority: api.interpreter.caiyunai.com" ^
  -H "accept: application/json, text/plain, */*" ^
  -H "accept-language: zh-CN,zh;q=0.9" ^
  -H "app-name: xy" ^
  -H "content-type: application/json;charset=UTF-8" ^
  -H "device-id: 71f8a02a4a4c970d3ddbbe2479c6183b" ^
  -H "origin: https://fanyi.caiyunapp.com" ^
  -H "os-type: web" ^
  -H "os-version;" ^
  -H "referer: https://fanyi.caiyunapp.com/" ^
  -H "sec-ch-ua: \"Chromium\";v=\"112\", \"Google Chrome\";v=\"112\", \"Not:A-Brand\";v=\"99\"" ^
  -H "sec-ch-ua-mobile: ?0" ^
  -H "sec-ch-ua-platform: \"Windows\"" ^
  -H "sec-fetch-dest: empty" ^
  -H "sec-fetch-mode: cors" ^
  -H "sec-fetch-site: cross-site" ^
  -H "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36" ^
  -H "x-authorization: token:qgemv4jr1y38jyq6vhvi" ^
  --data-raw "{\"trans_type\":\"en2zh\",\"source\":\"payload\"}" ^
  --compressed
2. 请求方法错误

造成这种错误的原因是服务器不允许你使用的 HTTP 请求方法。默认情况下,curl 使用 GET 请求方法,如果要用 POST 方法,需要在 curl 命令行加入 '-X POST' 来指定使用 POST 请求。只需修改第一行即可。

curl "https://api.interpreter.caiyunai.com/v1/dict" -X POST
3. 版本不支持错误

这是由于 curl 版本不支持 '-- compressed' 造成的,这个选项用于告诉 curl 在请求时要求服务器返回压缩过的响应,以减少数据传输量。但是你的 curl 版本不支持这个选项。 解决的办法就是删除掉 curl 命令中的 '--compressed' 选项,然后再次尝试运行命令。

处理完这些错误以后,你的 curl 命令就能正常运行了,运行结果应该是返回一大串 json。