@@ -20,21 +20,46 @@ public final class HTTPClient {
2020
2121 // MARK: Other Public Methods
2222
23+ /// Send an HTTP request.
24+ /// - Parameters:
25+ /// - requestContents: Request contents.
26+ /// - Returns: Response body.
27+ /// - SeeAlso: ``request(_:requestBody:)``
28+ public func request< T: Request > ( _ requestContents: T ) async throws -> T . ResponseBody {
29+ let request = try createRequest ( requestContents)
30+ return try await self . request ( requestContents, request: request)
31+ }
32+
33+ /// Send an HTTP request.
34+ /// - Parameters:
35+ /// - requestContents: Request contents.
36+ /// - requestBody: Request body.
37+ /// - Returns: Response body.
38+ /// - SeeAlso: ``request(_:)``
39+ public func request< T: Request , U: Encodable > ( _ requestContents: T , requestBody: U ) async throws -> T . ResponseBody {
40+ var request : URLRequest
41+ request = try createRequest ( requestContents)
42+ request. httpBody = try JSONEncoder ( ) . encode ( requestBody)
43+ return try await self . request ( requestContents, request: request)
44+ }
45+
2346 /// Send an HTTP request.
2447 /// - Parameters:
2548 /// - requestContents: Request contents.
2649 /// - completion: Completion handler.
2750 /// - SeeAlso: ``request(_:requestBody:completion:)``
51+ @available ( iOS, deprecated: 13.0 , message: " Consider using asynchronous alternative function " )
52+ @available ( macOS, deprecated: 10.15 , message: " Consider using asynchronous alternative function " )
53+ @available ( tvOS, deprecated: 13.0 , message: " Consider using asynchronous alternative function " )
54+ @available ( watchOS, deprecated: 6.0 , message: " Consider using asynchronous alternative function " )
2855 public func request< T: Request > ( _ requestContents: T , completion: @escaping ( Result < T . ResponseBody , Error > ) -> Void ) {
29- let request : URLRequest
3056 do {
31- request = try createRequest ( requestContents)
32- } catch let error {
57+ let request = try createRequest ( requestContents)
58+ self . request ( requestContents, request: request, completion: completion)
59+ } catch {
3360 completion ( . failure( error) )
3461 return
3562 }
36-
37- self . request ( requestContents, request: request, completion: completion)
3863 }
3964
4065 /// Send an HTTP request.
@@ -43,17 +68,20 @@ public final class HTTPClient {
4368 /// - requestBody: Request body.
4469 /// - completion: Completion handler.
4570 /// - SeeAlso: ``request(_:completion:)``
71+ @available ( iOS, deprecated: 13.0 , message: " Consider using asynchronous alternative function " )
72+ @available ( macOS, deprecated: 10.15 , message: " Consider using asynchronous alternative function " )
73+ @available ( tvOS, deprecated: 13.0 , message: " Consider using asynchronous alternative function " )
74+ @available ( watchOS, deprecated: 6.0 , message: " Consider using asynchronous alternative function " )
4675 public func request< T: Request , U: Encodable > ( _ requestContents: T , requestBody: U , completion: @escaping ( Result < T . ResponseBody , Error > ) -> Void ) {
47- var request : URLRequest
4876 do {
77+ var request : URLRequest
4978 request = try createRequest ( requestContents)
5079 request. httpBody = try JSONEncoder ( ) . encode ( requestBody)
51- } catch let error {
80+ self . request ( requestContents, request: request, completion: completion)
81+ } catch {
5282 completion ( . failure( error) )
5383 return
5484 }
55-
56- self . request ( requestContents, request: request, completion: completion)
5785 }
5886
5987 // MARK: Other Private Methods
@@ -80,6 +108,16 @@ public final class HTTPClient {
80108 return request
81109 }
82110
111+ private func request< T: Request > ( _ requestContents: T , request: URLRequest ) async throws -> T . ResponseBody {
112+ let ( data, response) = try await URLSession . shared. data ( from: request)
113+ if let requestError = validateResponse ( response) {
114+ throw requestError
115+ }
116+ let jsonDecoder = JSONDecoder ( )
117+ jsonDecoder. keyDecodingStrategy = . convertFromSnakeCase
118+ return try jsonDecoder. decode ( T . ResponseBody. self, from: data)
119+ }
120+
83121 private func request< T: Request > ( _ requestContents: T , request: URLRequest , completion: @escaping ( Result < T . ResponseBody , Error > ) -> Void ) {
84122 URLSession . shared. dataTask ( with: request) { data, response, error in
85123 if let error = error {
@@ -100,7 +138,7 @@ public final class HTTPClient {
100138 let responseBody = try jsonDecoder. decode ( T . ResponseBody. self, from: data)
101139 completion ( . success( responseBody) )
102140 return
103- } catch let error {
141+ } catch {
104142 completion ( . failure( error) )
105143 return
106144 }
0 commit comments