mirror of
https://github.com/samsonjs/Osiris.git
synced 2026-04-27 14:57:38 +00:00
Change HTTPRequest from class to struct
This commit is contained in:
parent
012ff20c96
commit
15f820bd91
3 changed files with 33 additions and 21 deletions
|
|
@ -75,7 +75,8 @@ final class Service {
|
||||||
// For example... (you probably want a more specific result type unpacked from the response though)
|
// For example... (you probably want a more specific result type unpacked from the response though)
|
||||||
func signUp(email: String, password: String, avatar: UIImage) -> Promise<HTTPResponse> {
|
func signUp(email: String, password: String, avatar: UIImage) -> Promise<HTTPResponse> {
|
||||||
let parameters = ["email" : email, "password" : password]
|
let parameters = ["email" : email, "password" : password]
|
||||||
let request = postRequest(path: "/accounts", parameters: parameters)
|
let url = environment.baseURL.appendingPathComponent("accounts")
|
||||||
|
var request = HTTPRequest.post(url, contentType: .formEncoded, parameters: parameters)
|
||||||
request.addMultipartJPEG(name: "avatar", image: avatar, quality: 1)
|
request.addMultipartJPEG(name: "avatar", image: avatar, quality: 1)
|
||||||
return performRequest(request)
|
return performRequest(request)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,13 +29,17 @@ enum HTTPContentType {
|
||||||
case multipart
|
case multipart
|
||||||
}
|
}
|
||||||
|
|
||||||
final class HTTPRequest {
|
struct HTTPRequest {
|
||||||
let method: HTTPMethod
|
var method: HTTPMethod
|
||||||
let url: URL
|
var url: URL
|
||||||
private(set) var contentType: HTTPContentType
|
var contentType: HTTPContentType
|
||||||
let parameters: [String : Any]?
|
var parameters: [String : Any]?
|
||||||
private(set) var headers: [String : String] = [:]
|
var headers: [String : String] = [:]
|
||||||
private(set) var parts: [MultipartFormEncoder.Part] = []
|
var parts: [MultipartFormEncoder.Part] = [] {
|
||||||
|
didSet {
|
||||||
|
if !parts.isEmpty { contentType = .multipart }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
init(method: HTTPMethod, url: URL, contentType: HTTPContentType = .none, parameters: [String : Any]? = nil) {
|
init(method: HTTPMethod, url: URL, contentType: HTTPContentType = .none, parameters: [String : Any]? = nil) {
|
||||||
self.method = method
|
self.method = method
|
||||||
|
|
@ -44,28 +48,34 @@ final class HTTPRequest {
|
||||||
self.parameters = parameters
|
self.parameters = parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
func addHeader(name: String, value: String) {
|
static func get(_ url: URL, contentType: HTTPContentType = .none) -> HTTPRequest {
|
||||||
headers[name] = value
|
HTTPRequest(method: .get, url: url, contentType: contentType)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func put(_ url: URL, contentType: HTTPContentType = .none, parameters: [String: Any]? = nil) -> HTTPRequest {
|
||||||
|
HTTPRequest(method: .put, url: url, contentType: contentType, parameters: parameters)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func post(_ url: URL, contentType: HTTPContentType = .none, parameters: [String: Any]? = nil) -> HTTPRequest {
|
||||||
|
HTTPRequest(method: .post, url: url, contentType: contentType, parameters: parameters)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func delete(_ url: URL, contentType: HTTPContentType = .none) -> HTTPRequest {
|
||||||
|
HTTPRequest(method: .delete, url: url, contentType: contentType)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if canImport(UIKit)
|
#if canImport(UIKit)
|
||||||
func addMultipartJPEG(name: String, image: UIImage, quality: CGFloat, filename: String? = nil) {
|
mutating func addMultipartJPEG(name: String, image: UIImage, quality: CGFloat, filename: String? = nil) {
|
||||||
guard let data = image.jpegData(compressionQuality: quality) else {
|
guard let data = image.jpegData(compressionQuality: quality) else {
|
||||||
assertionFailure()
|
assertionFailure()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let part = MultipartFormEncoder.Part(name: name, content: .binary(data, type: "image/jpeg", filename: filename ?? "image.jpeg"))
|
parts.append(MultipartFormEncoder.Part(
|
||||||
addPart(part)
|
name: name,
|
||||||
|
content: .binary(data, type: "image/jpeg", filename: filename ?? "image.jpeg")
|
||||||
|
))
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private func addPart(_ part: MultipartFormEncoder.Part) {
|
|
||||||
// Convert this request to multipart
|
|
||||||
if parts.isEmpty {
|
|
||||||
contentType = .multipart
|
|
||||||
}
|
|
||||||
parts.append(part)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum HTTPRequestError: Error {
|
enum HTTPRequestError: Error {
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ enum RequestBuilderError: Error {
|
||||||
final class RequestBuilder {
|
final class RequestBuilder {
|
||||||
class func build(request: HTTPRequest) throws -> URLRequest {
|
class func build(request: HTTPRequest) throws -> URLRequest {
|
||||||
assert(!(request.method == .get && request.parameters != nil), "encoding GET params is not yet implemented")
|
assert(!(request.method == .get && request.parameters != nil), "encoding GET params is not yet implemented")
|
||||||
|
assert(!(request.method == .delete && request.parameters != nil), "encoding DELETE params is not yet implemented")
|
||||||
var result = URLRequest(url: request.url)
|
var result = URLRequest(url: request.url)
|
||||||
result.httpMethod = request.method.string
|
result.httpMethod = request.method.string
|
||||||
for (name, value) in request.headers {
|
for (name, value) in request.headers {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue