swift 中的多部分表单数据服务调用问题

Multipart form data service call issue in swift

提问人:Swift 提问时间:11/2/2023 更新时间:11/2/2023 访问量:24

问:

我已经创建了通用的多部分服务调用并在视图控制器中使用该方法

代码:使用此代码,我可以在模拟器中上传一些下载的图像,但当时需要更多时间,但是如果我上传模拟器默认图像,那么半小时后,服务也一直在呼叫我错了哪里。

我是在编码部分犯了错误,还是因为虚拟 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)")
        }
    }
}
}
Swift Image Web 服务 泛型 multipartform-data

评论

0赞 Larme 11/2/2023
什么是长度?您需要以质量 1.0 进行压缩吗?jpegData

答: 暂无答案