4xx / 5xx에서 예외를 발생시키지 않고 Powershell 웹 요청


82

웹 요청을 만들고 응답의 상태 코드를 검사하는 데 필요한 powershell 스크립트를 작성 중입니다.

나는 이것을 쓰려고 시도했다.

$client = new-object system.net.webclient

$response = $client.DownloadData($url)

뿐만 아니라 :

$response = Invoke-WebRequest $url

그러나 웹 페이지에 성공 상태 코드가 아닌 상태 코드가있을 때마다 PowerShell은 계속 진행하여 실제 응답 개체를 제공하는 대신 예외를 throw합니다.

페이지가로드되지 않은 경우에도 페이지의 상태 코드를 얻으려면 어떻게해야합니까?


나를 위해 일한이 docs.microsoft.com/en-us/powershell/module/... 호출 - WebRequest 클래스에서 캐치가 아닌 성공 메시지 : 예 7
user3520245

답변:


121

이 시도:

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

이것이 예외를 던지는 것은 다소 안타까운 일이지만 그 방법입니다.

댓글 별 업데이트

이러한 오류가 여전히 유효한 응답을 반환하도록하려면 해당 유형의 예외를 캡처 WebException하고 관련 Response.

예외에 대한 응답은 type System.Net.HttpWebResponse이지만 성공적인 Invoke-WebRequest호출 의 응답 은 type Microsoft.PowerShell.Commands.HtmlWebResponseObject이므로 두 시나리오에서 호환 가능한 유형을 반환하려면 성공적인 응답의을 가져와야 BaseResponse합니다 System.Net.HttpWebResponse.

이 새로운 응답 유형의 상태 코드는 [system.net.httpstatuscode]단순한 정수가 아닌 유형의 열거 형 이므로 명시 적으로 int로 변환하거나 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
감사합니다. Exception 개체에서 Response 개체에 액세스 할 수 있다는 사실을 몰랐습니다.
jcarpenter2

1
예, 실제 코드 번호를 얻는 것은 약간 까다로 웠습니다. :-)
Keith Hill

내 이동은 Chris Wahl, wahlnetwork.com/2015/02/19/
FoxDeploy

11
약간 더 나은 방법 : $ response = try {Invoke-WebRequest localhost / foo } catch {$ _. Exception.Response} 이렇게하면 두 경우 모두 $ response 변수에서 무언가를 얻을 수 있습니다. 그러나 실패하면 HtmlWebResponse가 반환되지만 성공하면 HtmlWebResponseObject가 반환됩니다. 특히, 이들의 상태 코드는 서로 다른 유형의 (한숨 ..)입니다
롭 캐논은

4
다양한 유형의 문제를 피하기 위해 Rob의 훌륭한 제안에 대한 몇 가지 사소한 조정 : $response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseRequest } catch [System.Net.WebException] { $_.Exception.Response }. 즉, 가져 오기 BaseRequest는 성공 및 오류 시나리오 모두에서 HttpWebReqponse. 추가 [System.Net.WebException]하면 이러한 방식으로 관련 예외 만 캡처하고 실수로 다른 유형의 문제를 휩쓸 지 않습니다.
JohnLBevan

6

파워 쉘 버전부터 7.0 Invoke-WebRequest-SkipHttpErrorCheck스위치 매개 변수를.

-SkipHttpErrorCheck

이 매개 변수는 cmdlet이 HTTP 오류 상태를 무시하고 응답을 계속 처리하도록합니다. 오류 응답은 성공한 것처럼 파이프 라인에 기록됩니다.

이 매개 변수는 PowerShell 7에서 도입되었습니다.

문서 풀 요청


0

-SkipHttpErrorCheck PowerShell 7 이상을위한 최상의 솔루션이지만 아직 사용할 수없는 경우 대화 형 명령 줄 Poweshell 세션에 유용한 간단한 대안이 있습니다.

404 응답에 대한 오류 설명이 표시되면

원격 서버에서 오류를 반환했습니다 : (404) 찾을 수 없음.

그런 다음 다음을 입력하여 명령 줄에서 '마지막 오류'를 볼 수 있습니다.

$Error[0].Exception.Response.StatusCode

또는

$Error[0].Exception.Response.StatusDescription

또는`Response '객체에서 알고 싶은 다른 것이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.