我已经成功使用Invoke-WebRequest
PowerShell 向基于 REST 的 API 发布请求。
Invoke-WebRequest -UseBasicParsing https://my-rest-api.com/endpoint -ContentType "application/json" -Method POST -Body $json
今天我偶然发现了Invoke-RestMethod
一个更适合我所做事情的名字。它们有什么区别?有什么理由使用其中一个而不是另一个?
答案1
您可以通过反编译程序集来找到答案Microsoft.PowerShell.Commands.Utility
。
基本上,Invoke-WebRequest
它不处理太多数据解析。使用-UseBasicParsing
,它会进行一些基于正则表达式的 HTML 解析。如果没有此开关,它将使用 Internet Explorer COM API 来解析文档。
就是这样。它将始终尝试解析 HTML。
Invoke-RestMethod
另一方面,它有支持 JSON 和 XML 内容的代码。它会尝试检测合适的解码器。它确实不是支持 HTML(当然,除了符合 XML 标准的 HTML)。
两者共享相同的核心逻辑来发出实际的 HTTP 请求。它们仅在结果处理上有所不同。
眼见为实!
PS C:\Users\fuzzy> (Invoke-RestMethod https://httpbin.org/headers).headers
Connection Host User-Agent
---------- ---- ----------
close httpbin.org Mozilla/5.0 (Windows NT; Windows NT 10.0; de-DE) WindowsPowerShell/5.1.15063.483
PS C:\Users\fuzzy> Invoke-WebRequest -UseBasicParsing https://httpbin.org/headers
StatusCode : 200
StatusDescription : OK
Content : {
"headers": {
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (Windows NT; Windows NT 10.0; de-DE)
WindowsPowerShell/5.1.15063.483"
}
}
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Processed-Time: 0.00075101852417
Content-Length: 180
Content-Type: application/json...
Forms :
Headers : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,
true], [X-Processed-Time, 0.00075101852417]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml :
RawContentLength : 180
答案2
systemcenterautomation.com 做了关于此内容的博客文章。 结论:
Invoke-RestMethod
在处理 XML 和 JSON 结果方面表现更好,而Invoke-WebRequest
在处理直接 HTML 结果方面表现更好