.net - solucion - códigos de estado http pdf
Cómo obtener códigos de estado HTTP numéricos en PowerShell (4)
Sé de algunas buenas maneras de crear clientes web en PowerShell: las clases .NET System.Net.WebClient y System.Net.HttpWebRequest, o el objeto COM Msxml2.XMLHTTP. Por lo que puedo decir, el único que le da acceso al código de estado numérico (por ejemplo, 200, 404), es el último, el objeto COM. El problema que tengo es que no me gusta la forma en que funciona y no me gusta confiar en que el objeto COM esté allí. También sé que de vez en cuando Microsoft decidirá eliminar los objetos COM (bits de desactivación de ActiveX) debido a las vulnerabilidades de seguridad, etc.
¿Hay otro método .NET que me falta? ¿Está el código de estado en uno de estos otros dos objetos y no sé cómo obtenerlo?
Al usar las respuestas x0n y joshua ewer para completar el círculo con un ejemplo de código, espero que no sea tan malo:
$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
Me doy cuenta de que el título de la pregunta es sobre powershell, pero en realidad no es lo que se pregunta. De cualquier manera...
El WebClient es un envoltorio muy tonto para HttpWebRequest. WebClient es excelente si solo está haciendo un consumo muy simple de servicios o publicando un poco de Xml, pero la desventaja es que no es tan flexible como podría desear. No podrá obtener la información que está buscando en WebClient.
Si necesita el código de estado, consígalo en HttpWebResponse. Si estuvieras haciendo algo como esto (solo publicando una cadena en una URL) con cliente web:
var bytes =
System.Text.Encoding.ASCII.GetBytes("my xml");
var response =
new WebClient().UploadData("http://webservice.com", "POST", bytes);
entonces harías esto con HttpWebRequest para obtener el código de estado. La misma idea, solo más opciones (y por lo tanto más código).
//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;
Se ve muy facil
$wc = New-Object NET.WebClient
$wc.DownloadString($url)
$wc.ResponseHeaders.Item("status")
Puede encontrar los otros encabezados de respuesta disponibles en la propiedad ResponseHeaders (como content-type, content-length, x-powered-by y similares), y recuperar cualquiera de ellos mediante el método Item ().
... pero como Rob menciona a continuación, lamentablemente, la propiedad de estado no está disponible aquí
Utilice el tipo [system.net.httpstatuscode]
enumerado.
ps> [enum]::getnames([system.net.httpstatuscode])
Continue
SwitchingProtocols
OK
Created
Accepted
NonAuthoritativeInformation
NoContent
ResetContent
...
Para obtener el código numérico, convierte a [int]:
ps> [int][system.net.httpstatuscode]::ok
200
Espero que esto ayude,
-Oisin