powershell的invoke-webrequest不工作,但invoke-restmethod工作



我想获得一个网页的内容,当我使用

$web = Invoke-RestMethod -Uri "https://inkscape.org/"我将得到内容但是当我使用

$web = Invoke-WebRequest -Uri "https://inkscape.org/"我什么都得不到,为什么会这样??到底有什么区别?

简单地说,对于明文HTML响应体,(旧的)Invoke-WebRequestcmdlet与Invoke-RestMethodcmdlet之间的关系相对于默认的GET方法如下:

# -UseBasicParsing is only needed in *Windows PowerShell*.
(Invoke-WebRequest -UseBasicParsing -Uri "https://inkscape.org/").Content

等于:

Invoke-RestMethod -Uri "https://inkscape.org/"

:

  • Invoke-WebRequest返回一个响应对象,其.Content属性包含响应的主体总是作为文本(除非您使用-OutFile将原始主体保存到文件)。

    • HTML响应的身体,Windows PowerShell还试图解析HTML文本到HTML DOM,浮出水面通过.ParsedHTML属性,使用过时的Internet Explorer-UseBasicParsing抑制了这一点。这个开关在PowerShell (Core) 7+中没有作用,它基本上不支持解析HTML,需要第三方解决方案(参见此示例答案)或-仅在Windows上-基于com的解决方案(参见此答案)。
  • Invoke-RestMethod直接返回响应正文(仅限)。

    • 此外,如果目标站点指示返回XML或JSON数据,Invoke-RestMethod不会将正文作为文本返回,而是自动将其解析为[xml]实例/[System.Xml.XmlElement]实例(用于RSS/Atom提要)或[pscustomobject]图形(可以说,ConvertFrom-Json是内置在中的)。

    • 即使没有已知的响应数据格式,PowerShell也会尝试解析响应体,首先是XML,然后是JSON;如果所有尝试都失败,则返回纯文本([string]实例)。

    • 即使对于text/html响应,也会尝试将它们解析为XML。也就是说,如果页面恰好是有效的XML(这在现在很少见),您将得到一个[xml]实例;例如,非常简单的HTML5页面https://httpbin.org/html恰好是有效的XML(不包括<!DOCTYPE html>声明),而HTML5页面通常是而不是。因此,
      (Invoke-RestMethod https://httpbin.org/html).GetType().FullName返回System.Xml.XmlDocument,即[xml]实例。

最新更新