为什么cURL发送的http请求会产生与浏览器不同的结果?

时间:2016-04-30 08:03:05

标签: http curl

在Google Chrome浏览器中,我可以查看浏览器发送和接收的http标头。一个有趣的选项是您可以将整个请求/响应复制为cURL cmd

问题是,每次运行生成的cURL命令时,虽然服务器发送 HTTP / 1.1 200 OK ,但内容长度为零,这是不是浏览器本身发送相同请求的情况。

你的问题是什么?

3 个答案:

答案 0 :(得分:4)

听起来像是防御DDoS攻击的HTTP服务器。

HTTP服务器可能希望每个请求都包含特定时间和操作顺序的内容。它可能作为特殊标记驻留在标题或正文中。

我的猜测是每次服务器都可以使用不同的cookie值进行响应,这会使发送2个具有相同cookie值的请求无效。或者它可能是使用UTC时间作为参数的东西。无论如何,您的请求中必定存在一些未通过服务器端过滤的内容。

-

或类似地,它可能是一次性使用的资源。例如。准备一次性下载的临时文件。一旦访问,该文件就不再可用。

答案 1 :(得分:2)

我会将此添加为评论,但我没有声誉。

我刚刚有过这方面的经验以及解决这个问题的原因。在我的情况下,我登录到服务器,所以我可以上传文件,让服务器对它进行操作,然后下载新文件。我首先在Chrome中执行此操作,并使用开发工具在此简单事务中捕获超过100个HTTP请求。如果我试图从命令行执行所有这些操作,大多数只是抓取我不需要的资源,因此我只过滤掉了我至少应该需要的知识。

最初,这归结为GET设置cookie并使用用户名和密码登录,上传文件的POST,执行文件工作的POST以及检索新文件的GET。我无法获得第一个实际工作的POST。来自该POST的响应应该是包含上传ID,上传时间等的信息,但是我获得了空的JSON列表,即使状态为200 OK。

我使用CURL来完全欺骗来自浏览器的请求(复制用户代理,覆盖Expect等)并且仍然没有得到任何结果。然后我开始随意添加我在第一次GET和POST之间从Chrome中捕获的一些请求,并且在POST之前添加了JSON历史记录的GET请求后,POST实际上返回了它应该的内容。

TL; DR一些网站在初次登录后需要更多请求才能发布。我会尝试捕获服务器和浏览器之间的成功交换,并查看所有请求。有些请求可能不像看起来那样多余。

答案 2 :(得分:2)

如果您发送GET请求并且有一些参数,则网址应该是:

public IHttpActionResult Get(String fileName)
    {
        string var = fileName;

        string data = ("C:\\Users\\attsuap1\\Desktop\\" + var);

        string content = File.ReadAllText(data);

        return Ok(new { Data = content });
    }

确保使用'\'来逃避'&'在网址中,'&'是使用shell时将进程发送到后台的特殊关键字。

否则,上述网址将被截断为:

http://www.example.com/login?user='abc'&pwd='123'
相关问题