2009-09-24 11 views
16

Conosco uno few good ways per creare client Web in PowerShell: le classi .NET System.Net.WebClient e System.Net.HttpWebRequest o l'oggetto COM Msxml2.XMLHTTP. Da quello che posso dire, l'unico che ti dà accesso al codice di stato numerico (ad esempio 200, 404), è l'ultimo, l'oggetto COM. Il problema che ho è che non mi piace come funziona e non mi piace fare affidamento sull'oggetto COM presente. So anche che di quando in quando Microsoft deciderà di uccidere oggetti COM (kill bit ActiveX) a causa di vulnerabilità della sicurezza e così via.Come ottenere codici di stato HTTP numerici in PowerShell

C'è un altro metodo .NET che mi manca? Il codice di stato è in uno di questi altri due oggetti e io non so come ottenerlo?

risposta

47

Con entrambe le x0n e Joshua risposte di ewer per chiudere il cerchio con un esempio di codice, mi auguro che non è troppo cattiva 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

Ciò genera un'eccezione quando ottiene qualcosa tranne un messaggio 2xx (penso). Non è previsto un comportamento a mio parere –

+1

@JoePhilllips Ho aggiunto un tentativo ..prendere lo snippet in modo che possa gestire altri codici di stato. – merv

+0

@merv per qualche motivo la tua modifica è stata rifiutata da qualcun altro, ma sono andato avanti e ho aumentato il tuo commento e ho fatto la modifica manualmente. grazie per l'invio – halr9000

11

Utilizzare il tipo enumerato [system.net.httpstatuscode].

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

Per ottenere il codice numerico, gettato a [int]:

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

Spero che questo aiuti,

-Oisin

+0

Aha, la risposta era lì (avevo visto la stringa OK prima), ma non lo sapevo! Perfetto grazie. :) – halr9000

4

mi rendo conto che il titolo della domanda è di circa PowerShell, ma non è davvero quello che la domanda sta chiedendo? In entrambi i casi ...

Il WebClient è un wrapper molto stupido per HttpWebRequest. WebClient è ottimo se stai semplicemente facendo un semplice consumo di servizi o pubblicando un po 'di Xml, ma il compromesso è che non è così flessibile come potresti desiderarlo. Non sarai in grado di ottenere le informazioni che stai cercando da WebClient.

Se è necessario il codice di stato, scaricarlo da HttpWebResponse. Se si stavano facendo qualcosa di simile (solo inviare una stringa in un URL) w/WebClient:

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

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

allora faresti questo con HttpWebRequest per ottenere il codice di stato. Stessa idea, solo più opzioni (e quindi più codice).

//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 è la stringa e quindi utilizzo la tecnica dell'enumeratore di x0n per convertire in un numero. grazie :) – halr9000

+0

P.S. Se avessi lasciato il PowerShell nel titolo, sono certo che la risposta che avrei ottenuto sarebbe stata ancora più lontana da ciò che volevo. ma posso certamente leggere il tuo codice. – halr9000

1

E sembra molto facile

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

Puoi trovare gli altri header di risposta disponibili nella proprietà ResponseHeaders (come content-type, content-length, x-powered-by e simili), e recuperarne uno qualsiasi tramite il metodo Item().

... ma come rubare cita di seguito, purtroppo, la proprietà di stato non è disponibile qui

+1

Questo è quello che tutti vogliono lavorare, ma non è così. Non esiste uno "stato" nelle intestazioni di risposta dopo aver effettuato una richiesta con NET, WebClient. Peggio ancora, se non è un 200 allora viene lanciata un'eccezione e la proprietà responseheaders è nulla. – rob

Problemi correlati