记录下在实现一个在线的翻译程序时遇到的一些问题。 curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。但是,在有些时候需要使用浏览器生成的 curl 命令,在命令行中运行时会出现一些问题。下面就记录一些可能会遇到的问题吧。
一. 可能出现的错误
- 通过 Copy as Curl 的方法获取一个网页的翻译请求 curl 命令,然后放到命令行中去执行。比如在如下网站 fanyi.caiyunapp.com/#/ 获取一个单词的翻译,然后在 "检查" 中找到 NetWork 下的 dict 请求,并右击选择 "Copy as Curl" 来获取相应命令。
可能获取的命令如下:
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
-
在终端中复制运行此 curl 命令,可能会出现如下错误
(1) 命令格式错误
二. 解决方案
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。