Форма / данные из нескольких частей не работают с вложенным json - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь отправить изображение с некоторыми параметрами, но несколько параметров вложено JSON. Я всегда получал ошибку как «NSDebugDescription»: «Недопустимое значение вокруг символа 0.»

Я пробовал несколько решений для этого: 1. Almofire мульти-часть с кодируемым 2. Almofire multipart со словарем в качестве параметра 3. URLSession multipart со словарем в качестве параметра

но ни одно из вышеперечисленных решений не помогло мне

let parameters = [

        "blmusrname":registerModal?.ownerName,
        "blmcityrefid":"1",
        "blmstaterefid":"1",
        "blmcountryrefid":"1",
        "blmoptime" :[["startTime": "09:00:00","closeTime": "18:00:00","day": "1"]]
        ] as [String : Any]

    if let reportedImage = self.selectedImage
    {
        requestWithdata(NetworkConstants.APILink.registerBusiness, reportedImage.jpegData(compressionQuality: 0.25), parameters, "file") { (response, error) in
            if response != nil {
                print(response)

            }
        }
    }



func requestWithdata(_ urlString: String, _ imageData: Data?, _ parameters: [String : Any], _ filePathKey: String,  completion: @escaping ((_ response: [String: Any?]?, _ error: Error?) -> Void)) {

    if let url = URL(string: urlString) {
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        let boundary = generateBoundaryString()
        request.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")


        let access_token = Constants.BEARER.rawValue + UserDefaults.standard.string(forKey: Constants.ACCESS_TOKEN.rawValue)!
        request.addValue(access_token, forHTTPHeaderField: Constants.ACCESS_TOKEN.rawValue)

        guard let imgData = imageData else {
            completion(nil, nil)
            return
        }
        request.httpBody = self.createBodyWithParameters(parameters, filePathKey: filePathKey, imageDataKey: imgData, boundary: boundary)

        let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
            if let responseData = data {
                let responseString = String(data: data!, encoding: String.Encoding.utf8)
                print(responseString)
                do {
                    let jsonDict = try JSONSerialization.jsonObject(with: responseData, options: .allowFragments) as? [String: Any?]
                    completion(jsonDict, error)
                } catch {
                    completion(nil, error)
                }
            } else {
                completion(nil, error)
            }
        })
        task.resume()
    }
}

func createBodyWithParameters(_ parameters: [String: Any]?, filePathKey: String, imageDataKey: Data, boundary: String) -> Data {
    var body = Data()
    if parameters != nil {
        for (key, value) in parameters! {
            body.appedString("--\(boundary)\r\n")
            body.appedString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.appedString("\(value)\r\n")
        }
    }

    let filename = "user-profile.jpg"
    let mimetype = "image/jpg"

    body.appedString("--\(boundary)\r\n")
    body.appedString("Content-Disposition: form-data; name=\"\(filePathKey)\"; filename=\"\(filename)\"\r\n")
    body.appedString("Content-Type: \(mimetype)\r\n\r\n")
    body.append(imageDataKey)
    body.appedString("\r\n")
    body.appedString("--\(boundary)--\r\n")

    return body
}

Ожидается ответ от сервера, но он ничего не возвращает. когда я пытался отладить, он говорит "Multipart: Граница не найдена" Я пытаюсь из последних 2 дней. Кто-нибудь может помочь с этим? Я думаю, что отправка вложенного JSON в параметрах является проблемой.

Заранее спасибо

...