mirror of
https://github.com/samsonjs/Osiris.git
synced 2026-03-25 08:55:48 +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)
|
||||
func signUp(email: String, password: String, avatar: UIImage) -> Promise<HTTPResponse> {
|
||||
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)
|
||||
return performRequest(request)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,13 +29,17 @@ enum HTTPContentType {
|
|||
case multipart
|
||||
}
|
||||
|
||||
final class HTTPRequest {
|
||||
let method: HTTPMethod
|
||||
let url: URL
|
||||
private(set) var contentType: HTTPContentType
|
||||
let parameters: [String : Any]?
|
||||
private(set) var headers: [String : String] = [:]
|
||||
private(set) var parts: [MultipartFormEncoder.Part] = []
|
||||
struct HTTPRequest {
|
||||
var method: HTTPMethod
|
||||
var url: URL
|
||||
var contentType: HTTPContentType
|
||||
var parameters: [String : Any]?
|
||||
var headers: [String : String] = [:]
|
||||
var parts: [MultipartFormEncoder.Part] = [] {
|
||||
didSet {
|
||||
if !parts.isEmpty { contentType = .multipart }
|
||||
}
|
||||
}
|
||||
|
||||
init(method: HTTPMethod, url: URL, contentType: HTTPContentType = .none, parameters: [String : Any]? = nil) {
|
||||
self.method = method
|
||||
|
|
@ -44,28 +48,34 @@ final class HTTPRequest {
|
|||
self.parameters = parameters
|
||||
}
|
||||
|
||||
func addHeader(name: String, value: String) {
|
||||
headers[name] = value
|
||||
static func get(_ url: URL, contentType: HTTPContentType = .none) -> HTTPRequest {
|
||||
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)
|
||||
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 {
|
||||
assertionFailure()
|
||||
return
|
||||
}
|
||||
let part = MultipartFormEncoder.Part(name: name, content: .binary(data, type: "image/jpeg", filename: filename ?? "image.jpeg"))
|
||||
addPart(part)
|
||||
parts.append(MultipartFormEncoder.Part(
|
||||
name: name,
|
||||
content: .binary(data, type: "image/jpeg", filename: filename ?? "image.jpeg")
|
||||
))
|
||||
}
|
||||
#endif
|
||||
|
||||
private func addPart(_ part: MultipartFormEncoder.Part) {
|
||||
// Convert this request to multipart
|
||||
if parts.isEmpty {
|
||||
contentType = .multipart
|
||||
}
|
||||
parts.append(part)
|
||||
}
|
||||
}
|
||||
|
||||
enum HTTPRequestError: Error {
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ enum RequestBuilderError: Error {
|
|||
final class RequestBuilder {
|
||||
class func build(request: HTTPRequest) throws -> URLRequest {
|
||||
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)
|
||||
result.httpMethod = request.method.string
|
||||
for (name, value) in request.headers {
|
||||
|
|
|
|||
Loading…
Reference in a new issue