4xx / 5xx पर अपवाद को छोड़े बिना पॉवरशेल वेब अनुरोध


82

मैं एक पॉवरशेल स्क्रिप्ट लिख रहा हूं जिसे वेब अनुरोध करने और प्रतिक्रिया की स्थिति कोड का निरीक्षण करने की आवश्यकता है।

मैंने इसे लिखने की कोशिश की है:

$client = new-object system.net.webclient

$response = $client.DownloadData($url)

साथ में यह भी:

$response = Invoke-WebRequest $url

लेकिन जब भी वेब पेज पर एक स्थिति कोड होता है जो एक सफल स्थिति कोड नहीं होता है, तो PowerShell आगे बढ़ता है और मुझे वास्तविक प्रतिक्रिया ऑब्जेक्ट देने के बजाय एक अपवाद फेंकता है।

लोड होने में विफल होने पर भी मुझे पृष्ठ का स्थिति कोड कैसे मिल सकता है?


इसने मेरे लिए काम किया docs.microsoft.com/en-us/powershell/module/… उदाहरण 7: Invoke-WebRequest से गैर-सफलता संदेशों को पकड़ो
user3520245

जवाबों:


121

इसे इस्तेमाल करे:

try { $response = Invoke-WebRequest http://localhost/foo } catch {
      $_.Exception.Response.StatusCode.Value__}

यह एक बुमेर की तरह है कि यह एक अपवाद फेंकता है लेकिन यह तरीका है।

प्रति टिप्पणी अपडेट करें

यह सुनिश्चित करने के लिए कि ऐसी त्रुटियां अभी भी एक वैध प्रतिक्रिया देती हैं, आप प्रकार के उन अपवादों को पकड़ सकते हैं WebExceptionऔर संबंधित को प्राप्त कर सकते हैं Response

चूंकि अपवाद पर प्रतिक्रिया प्रकार की है System.Net.HttpWebResponse, जबकि एक सफल Invoke-WebRequestकॉल से प्रतिक्रिया प्रकार की है Microsoft.PowerShell.Commands.HtmlWebResponseObject, दोनों परिदृश्यों से एक संगत प्रकार को वापस करने के लिए हमें सफल प्रतिक्रिया लेने की आवश्यकता है BaseResponse, जो कि प्रकार का भी है System.Net.HttpWebResponse

इस नए प्रतिक्रिया प्रकार की स्थिति कोड [system.net.httpstatuscode]एक साधारण पूर्णांक के बजाय एक प्रकार की पहेली है, इसलिए आपको यह पता लगाना होगा कि इसे इंट में परिवर्तित करना है, या Value__संख्यात्मक कोड प्राप्त करने के लिए ऊपर वर्णित संपत्ति तक पहुंच है ।

#ensure we get a response even if an error's returned
$response = try { 
    (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseResponse
} catch [System.Net.WebException] { 
    Write-Verbose "An exception was caught: $($_.Exception.Message)"
    $_.Exception.Response 
} 

#then convert the status code enum to int by doing this
$statusCodeInt = [int]$response.BaseResponse.StatusCode
#or this
$statusCodeInt = $response.BaseResponse.StatusCode.Value__

5
धन्यवाद, यह काम किया। मुझे महसूस नहीं हुआ कि आप केवल अपवाद वस्तु से प्रतिक्रिया वस्तु तक पहुँच सकते हैं।
jcarpenter2 18

1
हाँ, वास्तविक कोड संख्या प्राप्त करना थोड़ा मुश्किल था। :-)
कीथ हिल

मेरा जाना क्रिस वाहल के इस कोड का उपयोग करने के लिए है, wahlnetwork.com/2015/02/19/…
FoxDeploy

11
थोड़ा बेहतर तरीका: $ प्रतिक्रिया = कोशिश करें {इनवोक-वेबरॉस्टेस्ट लोकलहोस्ट / foo } को {$ $। Exception.Response} को पकड़ें, इस तरह से आपको दोनों मामलों में $ प्रतिसाद चर में कुछ मिलता है। लेकिन ध्यान रखें कि विफलता एक HtmlWebResponse देता है, लेकिन एक सफलता एक HtmlWebResponseOfject देता है। विशेष रूप से, उन पर स्टेटसकोड विभिन्न प्रकार (आह ..) हैं
रोब तोप

4
विभिन्न प्रकारों के साथ समस्या से बचने के लिए, रोब के महान सुझाव के लिए कुछ मामूली ट्विट्स $response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseRequest } catch [System.Net.WebException] { $_.Exception.Response }:। यानी लाने से BaseRequestयह सुनिश्चित होता है कि सफलता और त्रुटि दोनों स्थितियों में हम प्राप्त कर रहे हैं HttpWebReqponse। जोड़ना [System.Net.WebException]यह सुनिश्चित करता है कि हम केवल प्रासंगिक अपवादों को इस तरह से कैप्चर करें / गलती से अन्य प्रकार के मुद्दों को स्वीप न करें।
जॉनएल्वेन

6

चूंकि Powershell संस्करण 7.0 Invoke-WebRequestमें -SkipHttpErrorCheckस्विच पैरामीटर है।

-SkipHttpErrorCheck

इस पैरामीटर के कारण cmdlet HTTP त्रुटि स्थितियों को अनदेखा करता है और प्रतिक्रियाओं को संसाधित करना जारी रखता है। त्रुटि प्रतिक्रियाएं पाइप लाइन को लिखी जाती हैं जैसे कि वे सफल थीं।

यह पैरामीटर PowerShell 7 में पेश किया गया था।

डॉक्स पुल अनुरोध


0

-SkipHttpErrorCheck PowerShell 7+ के लिए सबसे अच्छा समाधान है, लेकिन अगर आप अभी तक इसका उपयोग नहीं कर सकते हैं, तो यहां एक सरल विकल्प है जो इंटरैक्टिव, कमांड-लाइन पॉवशेल सत्रों के लिए उपयोगी है।

जब आप 404 प्रतिक्रिया के लिए एक त्रुटि विवरण देखते हैं, अर्थात,

दूरस्थ सर्वर ने एक त्रुटि दी: (404) नहीं मिला।

फिर आप इसे दर्ज करके कमांड-लाइन से 'अंतिम त्रुटि' देख सकते हैं:

$Error[0].Exception.Response.StatusCode

या

$Error[0].Exception.Response.StatusDescription

या जो कुछ भी आप `रिस्पांस 'ऑब्जेक्ट से जानना चाहेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.