提问人:Swift 提问时间:11/2/2023 更新时间:11/2/2023 访问量:24
swift 中的多部分表单数据服务调用问题
Multipart form data service call issue in swift
问:
我已经创建了通用的多部分服务调用并在视图控制器中使用该方法
代码:使用此代码,我可以在模拟器中上传一些下载的图像,但当时需要更多时间,但是如果我上传模拟器默认图像,那么半小时后,服务也一直在呼叫我错了哪里。
我是在编码部分犯了错误,还是因为虚拟 URL“https://httpbin.org/post”
?
请纠正我。
class APINetworkManagerMultipart: NSObject {
static let sharedInstance = APINetworkManagerMultipart()
fileprivate override init() {
super.init()
}
func serviceCallWithMultipartFormData<T: Codable>(
url: URL,
headers: [String: String]?,
parameters: [String: Any],
completion: @escaping (Result<T, Error>) -> Void
) {
var request = URLRequest(url: url)
request.httpMethod = "POST"
let token = "a9e4390c-cf8f-4385-ac33-3be0a7dea9a2"
request.setValue(token, forHTTPHeaderField: "Postman-Token")
let boundary = "Boundary-\(UUID().uuidString)"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let body = NSMutableData()
for (key, value) in parameters {
if let stringValue = value as? String {
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!)
body.append("\(stringValue)\r\n".data(using: .utf8)!)
}
else if let data = value as? Data {
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"\(key)\"; filename=\"file\"\r\n".data(using: .utf8)!)
body.append("Content-Type: application/octet-stream\r\n\r\n".data(using: .utf8)!)
body.append(data)
body.append("\r\n".data(using: .utf8)!)
}
}
body.append("--\(boundary)--\r\n".data(using: .utf8)!)
request.httpBody = body as Data
// Add custom headers if provided
if let customHeaders = headers {
for (key, value) in customHeaders {
request.setValue(value, forHTTPHeaderField: key)
}
}
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
completion(.failure(error))
return
}
guard let data = data else {
completion(.failure(error!))
return
}
do {
let decodedData = try JSONDecoder().decode(T.self, from: data)
completion(.success(decodedData))
} catch {
completion(.failure(error))
}
}
task.resume()
}
}
并像这样呼叫服务呼叫
@IBAction func submitBtn(_ sender: UIButton) {
PostmanFormDataModel()
}
func PostmanFormDataModel(){
guard let urlStr = URL(string: "https://httpbin.org/post") else{return}
var jpegData: Data!
if let img = imageView.image {
jpegData = img.jpegData(compressionQuality: 1)
}
let parameters: [String: Any] = [
"name": "student2",
"email": "[email protected]",
"comment": "testing form data!!!!",
"file": jpegData as Any
] as! [String : Any]
DispatchQueue.global(qos: .background).async {
APINetworkManagerMultipart.sharedInstance.serviceCallWithMultipartFormData(url: urlStr, headers: nil, parameters: parameters) { (result: Result<PostmanFormDataModel, Error>) in
switch result {
case .success(let response):
self.formdataResponse = response
print("Response: \(response)")
case .failure(let error):
print("Error: \(error)")
}
}
}
}
答: 暂无答案
评论
jpegData