.NET의 HTTP 지원

HTTP(Hypertext Transfer Protocol)는 웹 서버에서 리소스를 요청하기 위한 프로토콜입니다. System.Net.Http.HttpClient 클래스는 URI로 식별되는 리소스에서 HTTP 요청을 보내고 HTTP 응답을 받는 기능을 노출합니다. 웹에서는 다양한 유형의 리소스를 사용할 수 있으며 HTTP는 이러한 리소스에 액세스하기 위한 요청 메서드 집합을 정의합니다.

HTTP 요청 메서드

요청 메서드는 해당 동사뿐만 아니라 다음과 같은 특성을 포함하여 여러 요인을 통해 구분됩니다.

  • 결과를 변경하지 않고 여러 번 성공적으로 처리할 수 있는 경우 요청 메서드는 멱등원입니다. 자세한 내용은 RFC 9110: 9.2.2. 멱등원 메서드를 참조하세요.
  • 해당 응답을 다시 사용할 수 있게 저장할 수 있는 경우 요청 메서드는 캐시 가능합니다. 자세한 내용은 RFC 9110: 섹션 9.2.3. 메서드 및 캐싱을 참조하세요.
  • 리소스의 상태를 수정하지 않는 경우 요청 메서드는 안전한 메서드로 간주됩니다. 모든 안전한 메서드멱등원이지만 모든 멱등원 메서드가 안전한 것으로 간주되지는 않습니다. 자세한 내용은 RFC 9110: 섹션 9.2.1. 안전한 메서드를 참조하세요.
HTTP 메서드 멱등원 캐시 가능 안전
GET ✔️ 예 ✔️ 예 ✔️ 예
POST ❌ 아니요 ⚠️ 거의 없음 ❌ 아니요
PUT ✔️ 예 ❌ 아니요 ❌ 아니요
PATCH ❌ 아니요 ❌ 아니요 ❌ 아니요
DELETE ✔️ 예 ❌ 아니요 ❌ 아니요
HEAD ✔️ 예 ✔️ 예 ✔️ 예
OPTIONS ✔️ 예 ❌ 아니요 ✔️ 예
TRACE ✔️ 예 ❌ 아니요 ✔️ 예
CONNECT ❌ 아니요 ❌ 아니요 ❌ 아니요

POST 메서드는 적절한 Cache-Control 또는 Expires 응답 헤더가 있는 경우에만 캐시할 수 있습니다. 이는 실제로 매우 드문 일입니다.

HTTP 상태 코드

.NET에서는 HttpClient를 사용하여 모든 인터넷 트래픽의 대부분을 구성하는 HTTP 프로토콜을 포괄적으로 지원합니다. 자세한 내용은 HttpClient 클래스를 사용하여 HTTP 요청 만들기를 참조하세요. 애플리케이션은 HttpRequestException을 catch하여 HTTP 프로토콜 오류를 수신합니다. HTTP 상태 코드는 HttpResponseMessage.StatusCode를 사용하여 HttpResponseMessage에서 보고되거나 호출된 메서드가 응답 메시지를 반환하지 않는 경우 HttpRequestException.StatusCode를 사용하여 HttpRequestException에서 보고됩니다. 오류 처리에 대한 자세한 내용은 HTTP 오류 처리를 참조하고, 상태 코드에 대한 자세한 내용은 RFC 9110, HTTP 의미 체계: 상태 코드를 참조하세요.

정보 상태 메시지

정보 상태 코드는 중간 응답을 반영합니다. 대부분의 중간 응답(예: HttpStatusCode.Continue)은 HttpClient에 의해 내부적으로 처리되며 사용자에게 노출되지 않습니다.

HTTP 상태 코드 HttpStatusCode
100 HttpStatusCode.Continue
101 HttpStatusCode.SwitchingProtocols
102 HttpStatusCode.Processing
103 HttpStatusCode.EarlyHints

성공 상태 코드

성공 상태 코드는 클라이언트의 요청이 성공적으로 수신, 이해 및 수락되었음을 나타냅니다.

HTTP 상태 코드 HttpStatusCode
200 HttpStatusCode.OK
201 HttpStatusCode.Created
202 HttpStatusCode.Accepted
203 HttpStatusCode.NonAuthoritativeInformation
204 HttpStatusCode.NoContent
205 HttpStatusCode.ResetContent
206 HttpStatusCode.PartialContent
207 HttpStatusCode.MultiStatus
208 HttpStatusCode.AlreadyReported
226 HttpStatusCode.IMUsed

리디렉션 상태 코드

리디렉션 상태 코드를 사용하려면 사용자 에이전트가 요청을 이행하기 위해 작업을 수행해야 합니다. 자동 리디렉션은 기본적으로 켜져 있으며 HttpClientHandler.AllowAutoRedirect 또는 SocketsHttpHandler.AllowAutoRedirect를 사용하여 변경할 수 있습니다.

HTTP 상태 코드 HttpStatusCode
300 HttpStatusCode.MultipleChoices 또는 HttpStatusCode.Ambiguous
301 HttpStatusCode.MovedPermanently 또는 HttpStatusCode.Moved
302 HttpStatusCode.Found 또는 HttpStatusCode.Redirect
303 HttpStatusCode.SeeOther 또는 HttpStatusCode.RedirectMethod
304 HttpStatusCode.NotModified
305 HttpStatusCode.UseProxy
306 HttpStatusCode.Unused
307 HttpStatusCode.TemporaryRedirect 또는 HttpStatusCode.RedirectKeepVerb
308 HttpStatusCode.PermanentRedirect

클라이언트 오류 상태 코드

클라이언트 오류 상태 코드는 클라이언트의 요청이 잘못되었음을 나타냅니다.

HTTP 상태 코드 HttpStatusCode
400 HttpStatusCode.BadRequest
401 HttpStatusCode.Unauthorized
402 HttpStatusCode.PaymentRequired
403 HttpStatusCode.Forbidden
404 HttpStatusCode.NotFound
405 HttpStatusCode.MethodNotAllowed
406 HttpStatusCode.NotAcceptable
407 HttpStatusCode.ProxyAuthenticationRequired
408 HttpStatusCode.RequestTimeout
409 HttpStatusCode.Conflict
410 HttpStatusCode.Gone
411 HttpStatusCode.LengthRequired
412 HttpStatusCode.PreconditionFailed
413 HttpStatusCode.RequestEntityTooLarge
414 HttpStatusCode.RequestUriTooLong
415 HttpStatusCode.UnsupportedMediaType
416 HttpStatusCode.RequestedRangeNotSatisfiable
417 HttpStatusCode.ExpectationFailed
418 I'm a teapot 🫖
421 HttpStatusCode.MisdirectedRequest
422 HttpStatusCode.UnprocessableEntity
423 HttpStatusCode.Locked
424 HttpStatusCode.FailedDependency
426 HttpStatusCode.UpgradeRequired
428 HttpStatusCode.PreconditionRequired
429 HttpStatusCode.TooManyRequests
431 HttpStatusCode.RequestHeaderFieldsTooLarge
451 HttpStatusCode.UnavailableForLegalReasons

서버 오류 상태 코드

서버 오류 상태 코드는 서버가 요청을 이행하지 못하는 예기치 않은 조건이 발생했음을 나타냅니다.

HTTP 상태 코드 HttpStatusCode
500 HttpStatusCode.InternalServerError
501 HttpStatusCode.NotImplemented
502 HttpStatusCode.BadGateway
503 HttpStatusCode.ServiceUnavailable
504 HttpStatusCode.GatewayTimeout
505 HttpStatusCode.HttpVersionNotSupported
506 HttpStatusCode.VariantAlsoNegotiates
507 HttpStatusCode.InsufficientStorage
508 HttpStatusCode.LoopDetected
510 HttpStatusCode.NotExtended
511 HttpStatusCode.NetworkAuthenticationRequired

추가 정보