Does anyone know if/where the HTTP status codes, as specified here, are defined in the iOS SDK? Or should I expect to manually re-define them in a constants file?
-
1I did a grep -r '404' * in /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/ and came up empty handed so the answer is almost certainly "no". – Kalle Jun 21 '11 at 11:20
-
1@Kalle You should post your comment as an answer, it seems to be a definitive one to me. – benzado Jun 22 '11 at 16:53
-
Done. :) (Min comment length filler) – Kalle Jun 22 '11 at 17:53
-
try [this library](https://github.com/rhodgkins/SwiftHTTPStatusCodes) – Gerald Jun 06 '16 at 08:51
7 Answers
Well, they are defined in the sense that
[NSHTTPURLResponse localizedStringForStatusCode:(NSInteger)statusCode]
can return a string for the given status code. Is that what you are looking for?

- 3,429
- 1
- 22
- 26
-
9Not quite -- I use HTTP status codes to control application logic - for example, 402 will trigger an AlertView telling the user that he should make an in-app purchase to continue. I have #defined HTTP_PAYMENT_REQUIRED 402, but I feel like that should already be present someplace in the API, as it is with Android. – esilver Apr 22 '11 at 19:37
I did a
grep -r '404' *
in
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/
and came up empty handed so the answer is almost certainly "no".

- 13,186
- 7
- 61
- 76
-
1Or maybe the codes are defined somewhere as an enum with relative values, like kHTTPErrorBadRequestCodes = 400 and kHTTPErrorNotFound = kHTTPErrorBadRequestCodes+4... so you can't be sure... – AliSoftware Jun 22 '11 at 18:39
-
3I can with confidence say that that would be pretty absurd, so I doubt it. – Kalle Jun 22 '11 at 19:11
-
There is a complete Obj-C library with all the codes defined to date: https://github.com/rafiki270/HTTP-Status-Codes-for-Objective-C
UPDATE: New Swift version is here: https://github.com/manGoweb/StatusCodes

- 4,342
- 8
- 42
- 65
I'm afraid you'll have to manually define them. I'm not familiar with Objective-C, following is my swift definition:
HTTP Status Enum in Swift 4 based on https://httpstatuses.com/
/// HTTP Statuses
///
/// - continue: Continue
/// - switchingProtocols: Switching Protocols
/// - processing: Processing
/// - ok: OK
/// - created: Created
/// - accepted: Accepted
/// - nonAuthoritativeInformation: Non-authoritative Information
/// - noContent: No Content
/// - resetContent: Reset Content
/// - partialContent: Partial Content
/// - multiStatus: Multi-Status
/// - alreadyReported: Already Reported
/// - iAmUsed: IM Used
/// - multipleChoices: Multiple Choices
/// - movedPermanently: Moved Permanently
/// - found: Found
/// - seeOther: See Other
/// - notModified: Not Modified
/// - useProxy: Use Proxy
/// - temporaryRedirect: Temporary Redirect
/// - permanentRedirect: Permanent Redirect
/// - badRequest: Bad Request
/// - unauthorized: Unauthorized
/// - paymentRequired: Payment Required
/// - forbidden: Forbidden
/// - notFound: Not Found
/// - methodNotAllowed: Method Not Allowed
/// - notAcceptable: Not Acceptable
/// - proxyAuthenticationRequired: Proxy Authentication Required
/// - requestTimeout: Request Timeout
/// - conflict: Conflict
/// - gone: Gone
/// - lengthRequired: Length Required
/// - preconditionFailed: Precondition Failed
/// - payloadTooLarge: Payload Too Large
/// - requestURITooLong: Request-URI Too Long
/// - unsupportedMediaType: Unsupported Media Type
/// - requestedRangeNotSatisfiable: Requested Range Not Satisfiable
/// - expectationFailed: Expectation Failed
/// - iAmATeapot: I'm a teapot
/// - misdirectedRequest: Misdirected Request
/// - unprocessableEntity: Unprocessable Entity
/// - locked: Locked
/// - failedDependency: Failed Dependency
/// - upgradeRequired: Upgrade Required
/// - preconditionRequired: Precondition Required
/// - tooManyRequests: Too Many Requests
/// - requestHeaderFieldsTooLarge: Request Header Fields Too Large
/// - connectionClosedWithoutResponse: Connection Closed Without Response
/// - unavailableForLegalReasons: Unavailable For Legal Reasons
/// - clientClosedRequest: Client Closed Request
/// - internalServerError: Internal Server Error
/// - notImplemented: Not Implemented
/// - badGateway: Bad Gateway
/// - serviceUnavailable: Service Unavailable
/// - gatewayTimeout: Gateway Timeout
/// - httpVersionNotSupported: HTTP Version Not Supported
/// - variantAlsoNegotiates: Variant Also Negotiates
/// - insufficientStorage: Insufficient Storage
/// - loopDetected: Loop Detected
/// - notExtended: Not Extended
/// - networkAuthenticationRequired: Network Authentication Required
/// - networkConnectTimeoutError: Network Connect Timeout Error
enum HttpStatus: Int {
case `continue` = 100
case switchingProtocols = 101
case processing = 102
case ok = 200
case created = 201
case accepted = 202
case nonAuthoritativeInformation = 203
case noContent = 204
case resetContent = 205
case partialContent = 206
case multiStatus = 207
case alreadyReported = 208
case iAmUsed = 226
case multipleChoices = 300
case movedPermanently = 301
case found = 302
case seeOther = 303
case notModified = 304
case useProxy = 305
case temporaryRedirect = 307
case permanentRedirect = 308
case badRequest = 400
case unauthorized = 401
case paymentRequired = 402
case forbidden = 403
case notFound = 404
case methodNotAllowed = 405
case notAcceptable = 406
case proxyAuthenticationRequired = 407
case requestTimeout = 408
case conflict = 409
case gone = 410
case lengthRequired = 411
case preconditionFailed = 412
case payloadTooLarge = 413
case requestURITooLong = 414
case unsupportedMediaType = 415
case requestedRangeNotSatisfiable = 416
case expectationFailed = 417
case iAmATeapot = 418
case misdirectedRequest = 421
case unprocessableEntity = 422
case locked = 423
case failedDependency = 424
case upgradeRequired = 426
case preconditionRequired = 428
case tooManyRequests = 429
case requestHeaderFieldsTooLarge = 431
case connectionClosedWithoutResponse = 444
case unavailableForLegalReasons = 451
case clientClosedRequest = 499
case internalServerError = 500
case notImplemented = 501
case badGateway = 502
case serviceUnavailable = 503
case gatewayTimeout = 504
case httpVersionNotSupported = 505
case variantAlsoNegotiates = 506
case insufficientStorage = 507
case loopDetected = 508
case notExtended = 510
case networkAuthenticationRequired = 511
case networkConnectTimeoutError = 599
}
extension HttpStatus: CustomStringConvertible {
var description: String {
// HTTPURLResponse.localizedString(forStatusCode: rawValue)
return NSLocalizedString(
"http_status_\(rawValue)",
tableName: "HttpStatusEnum",
comment: ""
)
}
}
HttpStatusEnum.strings
:
/// HTTP Status
"http_status_100" = "Continue";
"http_status_101" = "Switching Protocols";
"http_status_102" = "Processing";
"http_status_200" = "OK";
"http_status_201" = "Created";
"http_status_202" = "Accepted";
"http_status_203" = "Non-authoritative Information";
"http_status_204" = "No Content";
"http_status_205" = "Reset Content";
"http_status_206" = "Partial Content";
"http_status_207" = "Multi-Status";
"http_status_208" = "Already Reported";
"http_status_226" = "IM Used";
"http_status_300" = "Multiple Choices";
"http_status_301" = "Moved Permanently";
"http_status_302" = "Found";
"http_status_303" = "See Other";
"http_status_304" = "Not Modified";
"http_status_305" = "Use Proxy";
"http_status_307" = "Temporary Redirect";
"http_status_308" = "Permanent Redirect";
"http_status_400" = "Bad Request";
"http_status_401" = "Unauthorized";
"http_status_402" = "Payment Required";
"http_status_403" = "Forbidden";
"http_status_404" = "Not Found";
"http_status_405" = "Method Not Allowed";
"http_status_406" = "Not Acceptable";
"http_status_407" = "Proxy Authentication Required";
"http_status_408" = "Request Timeout";
"http_status_409" = "Conflict";
"http_status_410" = "Gone";
"http_status_411" = "Length Required";
"http_status_412" = "Precondition Failed";
"http_status_413" = "Payload Too Large";
"http_status_414" = "Request-URI Too Long";
"http_status_415" = "Unsupported Media Type";
"http_status_416" = "Requested Range Not Satisfiable";
"http_status_417" = "Expectation Failed";
"http_status_418" = "I'm a teapot";
"http_status_421" = "Misdirected Request";
"http_status_422" = "Unprocessable Entity";
"http_status_423" = "Locked";
"http_status_424" = "Failed Dependency";
"http_status_426" = "Upgrade Required";
"http_status_428" = "Precondition Required";
"http_status_429" = "Too Many Requests";
"http_status_431" = "Request Header Fields Too Large";
"http_status_444" = "Connection Closed Without Response";
"http_status_451" = "Unavailable For Legal Reasons";
"http_status_499" = "Client Closed Request";
"http_status_500" = "Internal Server Error";
"http_status_501" = "Not Implemented";
"http_status_502" = "Bad Gateway";
"http_status_503" = "Service Unavailable";
"http_status_504" = "Gateway Timeout";
"http_status_505" = "HTTP Version Not Supported";
"http_status_506" = "Variant Also Negotiates";
"http_status_507" = "Insufficient Storage";
"http_status_508" = "Loop Detected";
"http_status_510" = "Not Extended";
"http_status_511" = "Network Authentication Required";
"http_status_599" = "Network Connect Timeout Error";

- 61
- 1
- 2
I also could not find a header file which I expected to exist, so I had to write one of my own.
With HTTPStatusCodes.h contained in nv-ios-http-status project at GitHub, dispatch based on HTTP status codes can be written like the following.
#import "HTTPStatusCodes.h"
......
- (void)connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
switch ([res statusCode])
{
// 200 OK
case kHTTPStatusCodeOK:
......;
}
......
}
I hope HTTPStatusCodes.h can save time of you and other developers.

- 18,118
- 9
- 62
- 105
The http status code can be defined by the server response. When there is a connection, you can use the NSURLResponse to read out the statusCode. Those 4** response can be defined internally on your server.

- 146
- 5
-
1I think JocelynH has got it right: per the w3.org [link](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) in the OP, "Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation..." My guess is that Apple chose, for whatever reason, to opt out of the enum game for the 400-range of errors because they're supposed to be service-dependant. (Not that I necessarily agree with this reasoning.) – clozach Aug 25 '11 at 18:27