如何在PowerShell中获取数字HTTP状态代码

hal*_*000 22 .net powershell http

我知道在PowerShell中构建Web客户端的一些好方法:.NET类System.Net.WebClient和System.Net.HttpWebRequest,或COM对象Msxml2.XMLHTTP.据我所知,唯一一个允许您访问数字状态代码(例如200,404)的是最后一个COM对象.我遇到的问题是我不喜欢它的工作方式,我不喜欢依赖COM对象.我也知道,由于安全漏洞等原因,微软将不时决定杀死COM对象(ActiveX kill bits).

还有其他.NET方法我错过了吗?状态代码是否是其他两个对象之一,我只是不知道如何获取它?

hal*_*000 56

使用x0n和joshua ewer的答案来完整的代码示例,我希望形式不是太糟糕:

$url = 'http://google.com'
$req = [system.Net.WebRequest]::Create($url)

try {
    $res = $req.GetResponse()
} 
catch [System.Net.WebException] {
    $res = $_.Exception.Response
}

$res.StatusCode
#OK

[int]$res.StatusCode
#200
Run Code Online (Sandbox Code Playgroud)

  • 您还应该添加`$ req.method ="HEAD"`以仅下载标题而不是整个响应,这可能非常大. (3认同)
  • 当它收到除2xx消息以外的任何消息时,都会引发异常(我认为)。我认为这不是预期的行为 (2认同)

x0n*_*x0n 13

使用[system.net.httpstatuscode]枚举类型.

ps> [enum]::getnames([system.net.httpstatuscode])
Continue
SwitchingProtocols
OK
Created
Accepted
NonAuthoritativeInformation
NoContent
ResetContent
...
Run Code Online (Sandbox Code Playgroud)

要获取数字代码,请转换为[int]:

ps> [int][system.net.httpstatuscode]::ok
200
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助,

-Oisin


jos*_*wer 5

我意识到问题的标题是关于 powershell,但并不是真正的问题在问什么?无论哪种方式...

WebClient 是一个非常笨拙的 HttpWebRequest 包装器。如果您只是执行非常简单的服务消费或发布一些 Xml,WebClient 非常棒,但代价是它并不像您希望的那样灵活。您将无法从 WebClient 获取您正在寻找的信息。

如果您需要状态代码,请从 HttpWebResponse 中获取。如果您正在使用 WebClient 执行这样的操作(只需将字符串发布到 Url):

var bytes = 
    System.Text.Encoding.ASCII.GetBytes("my xml"); 

var response = 
    new WebClient().UploadData("http://webservice.com", "POST", bytes);
Run Code Online (Sandbox Code Playgroud)

然后你会用 HttpWebRequest 来获取状态代码。同样的想法,只是更多的选择(因此更多的代码)。

//create a stream from whatever you want to post here
var bytes = 
  System.Text.Encoding.ASCII.GetBytes("my xml"); 
var request = 
  (HttpWebRequest)WebRequest.Create("http://webservice.com");

//set up your request options here (method, mime-type, length)

//write something to the request stream
var requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);        
requestStream.Close();

var response = (HttpWebResponse)request.GetResponse();

//returns back the HttpStatusCode enumeration
var httpStatusCode = response.StatusCode;
Run Code Online (Sandbox Code Playgroud)