mirror of
https://github.com/zhigang1992/swift-request.git
synced 2026-01-13 17:42:38 +08:00
53 lines
1.8 KiB
Swift
53 lines
1.8 KiB
Swift
import Foundation
|
|
|
|
public extension Request {
|
|
func asURLRequest() throws -> URLRequest {
|
|
let url: URL
|
|
if let queryParams {
|
|
var components = URLComponents(url: self.url, resolvingAgainstBaseURL: false)!
|
|
components.queryItems = queryParams.compactMap { key, value in
|
|
guard let value = value else { return nil }
|
|
return URLQueryItem(name: key, value: value.description)
|
|
}
|
|
|
|
url = components.url!
|
|
} else {
|
|
url = self.url
|
|
}
|
|
|
|
var request = URLRequest(url: url)
|
|
request.httpMethod = self.method
|
|
|
|
if let formFields = self.formFields {
|
|
var form = URLComponents()
|
|
form.queryItems = formFields.compactMap { key, value in
|
|
guard let value = value else { return nil }
|
|
return URLQueryItem(name: key, value: value.description)
|
|
}
|
|
|
|
request.httpBody = form.query?.data(using: .utf8)
|
|
}
|
|
|
|
if let body {
|
|
if body is Data {
|
|
request.httpBody = body as? Data
|
|
} else {
|
|
request.httpBody = try JSONEncoder().encode(body)
|
|
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
}
|
|
} else if let bodyFields {
|
|
request.httpBody = try JSONSerialization.data(withJSONObject: bodyFields)
|
|
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
}
|
|
|
|
if let headers {
|
|
for (key, value) in headers {
|
|
guard let value = value else { continue }
|
|
request.addValue(value.description, forHTTPHeaderField: key)
|
|
}
|
|
}
|
|
|
|
return request
|
|
}
|
|
}
|