如何删除 cURL 发送的默认标头?
Posted
技术标签:
【中文标题】如何删除 cURL 发送的默认标头?【英文标题】:How can I remove default headers that cURL sends? 【发布时间】:2015-09-26 09:27:11 【问题描述】:Curl 默认添加诸如Content-type
和User-agent
之类的标头。通常这是一件好事,但我正在尝试测试当这些标头丢失时我们的服务器会做什么。
我的问题是 Content-type
标头。如果它丢失,服务器正确地假定用户发送了 JSON。但是,curl 实际上添加了缺少的标头,并错误地假定我发布的内容是application/x-www-form-urlencoded
。它还发送 / 的 Accept 标头。
我认为这是很好的默认行为,但我基本上希望它不发送我没有指定的标头。有这样的选择吗?
curl -v -X POST 'https://example.com' -d '...'
> User-Agent: curl/7.37.1
> Host: domain.com
> Accept: */*
> Content-Length: 299
> Content-Type: application/x-www-form-urlencoded
【问题讨论】:
【参考方案1】:似乎curl
发送了 3 个标头。要在没有它们的情况下执行请求,您可以附加参数:
-H 'User-Agent:' -H 'Accept:' -H 'Host:'
+1 到 @cmlndz 回答,因为他解释了如何删除单个标题。
您可以通过添加-v
来检查实际发送了哪些标头。
【讨论】:
如果您的请求有正文(如 POST 请求),它还将设置Content-Length: 433
或任何正文的大小。您可以使用 -H 'Content-Length:'
排除该标头(尽管这可能会导致无效请求,因为它应该包含长度或设置 Transfer-Encoding 标头)
-H 'Host:'
很可能会导致“HTTP 错误 400。请求主机名无效。”您还需要将 --http1.0
参数添加到 curl 命令。【参考方案2】:
将-H
标志与要删除的标头一起使用,并且在:
之后没有内容
-H, --header LINE Custom header to pass to server (H)
样本
-H 'User-Agent:'
这将使请求没有 User-Agent
标头(而不是使用空值发送)
【讨论】:
要删除代理标头,请将 -H 替换为 --proxy-header,例如--proxy-header "Proxy-Connection:"
使用标准的 Windows shell (cmd.exe
) 我不得不用双引号替换单引号(或完全删除它们)。
-H 'User-Agent:'
按预期删除标头(没有标头,也不会发送任何值),但要小心-H 'Content-Type:'
,它将发送带有空值的标头。 curl 命令的不同行为很奇怪。
与@mikep 的经验相反,我发现(来自libcurl,版本7.63.0)将“Content-Type:”设置为标头确实从请求中完全删除了该标头,至少根据Wireshark 捕获。
我有curl 7.66.0 (x86_64-pc-cygwin) libcurl/7.66.0
,如果我将-H 'Content-Type:'
作为参数传递它不会发送Content-Type
标头。以上是关于如何删除 cURL 发送的默认标头?的主要内容,如果未能解决你的问题,请参考以下文章
如何删除 HttpClient 请求标头 C# 中的默认字符集