如何防止CURL将“#”变成注释?

时间:2019-02-24 10:33:09

标签: curl cmd

我正在使用CURL来调用端点。

我的端点有#作为其一部分,例如

"http://Server.com/Magicxpi4.6/MgWebRequester.dlll?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-Arest#Trigger1"

当我使用CURL命令调用此终结点时,它会在井号后切掉我的终结点,并且留下:

"http://Server.com/Magicxpi4.6/MgWebRequester.dlll?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-Arest" ('#Trigger1' is missing)

我尝试用%23替换已签名的,并且得到以下结果:

"http://Server.com/Magicxpi4.6/MgWebRequester.dlll?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-Arest3Trigger1"

使用的完整命令:

curl -H "Content-Type: application/json" -X POST -d "{"id":"1"}" "http://Server.com/Magicxpi4.6/MgWebRequester.dlll?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-Arest#Trigger1"

3 个答案:

答案 0 :(得分:2)

如果您(正确)在参数中使用了%23,但是您得到了

"http://...?...&arguments=-Arest3Trigger1"
                                ^

缺少%2时,您可能正在从批处理文件进行调用,并且%2被解析为该批处理文件的第二个参数(在这种情况下为空)。

在这种情况下,您将需要使用%%23将其加倍以转义百分号。

从批处理文件开始

curl "http://httpbin.org/anything?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-Arest%%23Trigger1"

调用httpbin.org请求和响应服务将返回

{
  "args": {
    "appname": "IFSCarolina_Prod",
    "arguments": "-Arest#Trigger1",
    "prgname": "HTTP"
  },
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1"
  },
  "json": null,
  "method": "GET",
  "origin": "   .   .   .   ",
  "url": "https://httpbin.org/anything?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-Arest%23Trigger1"
}

答案 1 :(得分:1)

Curl不会将#变成备注。 #符号及其后的所有内容均不打算发送到服务器,因此不可以卷曲。

#之前的部分发送到服务器,并确定服务器发送回什么。

在标准HTML中,#之后的部分用于滚动到锚点或具有给定名称的元素。

使用浏览器中的JavaScript,脚本可以确定#之后的部分,并用它来完成其想做的事情。

但是curl不是JavaScript解释器,它只是从服务器获取数据,因此它会忽略#之后的部分。

答案 2 :(得分:0)

我相信这确实会破坏HTTP规范,但是,如果您确实想这样做(并且您可能不想这样做),我相信您可以滥用-X来完成它:

curl 'http://Server.com' -X "$(printf 'GET /Magicxpi4.6/MgWebRequester.dlll?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-Arest#Trigger1 HTTP/1.1\r\nX-ignore-this: ')"

这将为您提供:

GET /Magicxpi4.6/MgWebRequester.dlll?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-Arest#Trigger1 HTTP/1.1
X-ignore-this:  / HTTP/1.1
Host: Server.com
User-Agent: curl/7.63.0
Accept: */*

...但是,实际上没有理智的HTTP服务器会要求您执行此操作,如果您想在其中添加主题标签,则将其像%23一样用urlencode进行编码,但这可能意味着您需要通用的URL,编码器也是如此