Как получить числовые коды состояния HTTP в PowerShell

Я знаю несколько хороших способов для создания веб-клиентов в PowerShell: классы .NET System.Net.WebClient и System.Net. HttpWebRequest или COM-объект Msxml2.XMLHTTP. Из того, что я могу сказать, единственный, который дает вам доступ к цифровому коду состояния (например, 200, 404), является последним, COM-объектом. Проблема в том, что мне не нравится, как это работает, и мне не нравится полагаться на COM-объект, находящийся там. Я также знаю, что время от времени Microsoft решает убить COM-объекты (бит уничтожения ActiveX) из-за уязвимостей и т.д.

Есть ли другой метод .NET, который мне не хватает? Является ли код статуса в одном из этих двух других объектов, и я просто не знаю, как это сделать?

Ответ 1

Используя как 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

Ответ 2

Используйте нумерованный тип [system.net.httpstatuscode].

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

Чтобы получить числовой код, введите в [int]:

ps> [int][system.net.httpstatuscode]::ok
200

Надеюсь, что это поможет,

-Oisin

Ответ 3

Я понимаю, что заголовок вопроса о powershell, но не совсем то, что задает вопрос? В любом случае...

WebClient - очень обманутая оболочка для HttpWebRequest. WebClient замечательный, если вы просто очень просто потребляете услуги или размещаете немного Xml, но компромисс заключается в том, что он не настолько гибкий, как вы могли бы захотеть. Вы не сможете получить информацию, которую ищете от WebClient.

Если вам нужен код состояния, получите его из HttpWebResponse. Если вы делали что-то вроде этого (просто отправляя строку в URL) w/WebClient:

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

var response = 
    new WebClient().UploadData("http://webservice.com", "POST", bytes);

то вы должны сделать это с помощью 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;

Ответ 4

Он выглядит очень легко

$wc = New-Object NET.WebClient
$wc.DownloadString($url)
$wc.ResponseHeaders.Item("status")

Вы можете найти другие доступные заголовки ответов в свойстве ResponseHeaders (например, тип контента, длина контента, x-powered-on и т.д.) и получить любой из них с помощью метода Item().

... но, как упоминает rob, ниже, к сожалению, свойство статуса недоступно здесь.