2009-09-24 24 views
16

Conozco un few good ways para compilar 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é ahí. También sé que, de vez en cuando, Microsoft decidirá eliminar objetos COM (bits de interrupción ActiveX) debido a vulnerabilidades de seguridad, etc.Cómo obtener códigos de estado HTTP numéricos en PowerShell

¿Hay otro método .NET que me falta? ¿El código de estado está en uno de estos otros dos objetos y simplemente no sé cómo hacerlo?

Respuesta

47

Con las dos respuestas de jarro x0n y Joshua cerrar el círculo con un ejemplo de código, espero que no es demasiado mala forma:

$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 
+1

Esto arroja una excepción cuando recibe algo más que un mensaje 2xx (creo). Ese no es el comportamiento esperado en mi opinión –

+1

@JoePhilllips He añadido un intento ..capturar el fragmento para que pueda manejar otros códigos de estado. – merv

+0

@merv por alguna razón su edición fue rechazada por otra persona, pero continué y voté por encima de su comentario e hice la edición manualmente. thx para la presentación – halr9000

11

Use el tipo enumerado [system.net.httpstatuscode].

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

para obtener el código numérico, echo a [int]:

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

Espero que esto ayude,

-Oisin

+0

Aha, la respuesta estaba allí (que había visto la cadena bien antes), pero yo no lo sabía! Perfecto gracias. :) – halr9000

4

realizo el título de la pregunta es acerca de PowerShell, pero realmente no es lo que la pregunta está haciendo? De cualquier manera ...

El WebClient es un envoltorio muy simplificado para HttpWebRequest. WebClient es genial si solo hace un consumo muy simple de servicios o publica un poco de Xml, pero la compensación es que no es tan flexible como podría desear. No podrá obtener la información que está buscando de WebClient.

Si necesita el código de estado, obténgalo de HttpWebResponse. Si estuviera haciendo algo como esto (la simple publicación de una cadena a una URL) w/cliente Web:

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

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

entonces lo que hace 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; 
+0

Aha, resposne.statuscode es la cadena y luego uso la técnica del enumerador x0n para convertir a un número. gracias :) – halr9000

+0

P.S. Si hubiera dejado el PowerShell en el título, entonces estoy seguro de que la respuesta que obtuve estaría aún más lejos de lo que quería. pero ciertamente puedo leer tu código. – halr9000

1

Se ve muy fácil

$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 tal), y recuperar cualquiera de ellos a través del método Item().

... pero como Rob menciona a continuación, por desgracia, la propiedad de estado no está disponible aquí

+1

Eso es lo que todos quieren trabajar, pero no es así. No hay "estado" en los encabezados de respuesta después de realizar una solicitud con NET, WebClient. Peor aún, si no es un 200, entonces se lanza una excepción y la propiedad responseheaders es nula. – rob

Cuestiones relacionadas