datatask с URL работает нормально, тогда как вызов datatask с запросом возвращает данные с мусором в конце - PullRequest
0 голосов
/ 05 мая 2018

Я вызываю веб-сервис, используя URLSession.shared.dataTask. Вызывая его с помощью, datatask с url работает нормально, тогда как вызов datatask с запросом возвращает данные с «мусором в конце». Может кто-нибудь объяснить мне, почему? Ниже приводится функция в 2 форматах.

dataTask, вызываемый с помощью URL (task = URLSession.shared.dataTask (with: url, extensionHandler), работает нормально и возвращает действительные результаты в данных.

basePath - путь к URL-адресу веб-службы

static func getUserDetails(withprefixText prefixText: String, withUserName userName:String, withPassword password:String) {
    // Call the web serrvice
urlString = basePath + "?prefixText=" + prefixText + "&prefixText1=" + userName + "&prefixText2=" + password
    guard let url = URL(string: urlString) else { return }

    let task = URLSession.shared.dataTask(with: url, completionHandler: { (data: Data?,response: URLResponse?,error: Error?) in

    if error != nil {
            print("error = \(String(describing: error))")
            return
        }
        //Let's convert response sent from a server side script to a NSDictionary object:
        do {
            let json = try JSONSerialization.jsonObject(with: data! , options: []) as? [String:Any]
            if let parseJSON = json {
                if let data = parseJSON["data"] as? [[String:Any]] {
        Now we can access values by it's key
                }
            }
            else {
                print ("Parsing error")
            }
        } catch {
            print("Serilization Error = \(error)")
        }
    })
    task.resume()
}

dataTask вызывается с запросом (task = URLSession.shared.dataTask (with: request, completeHandler) возвращает результаты в виде данных с мусором в конце. Поэтому JSONSerialization.jsonObject завершается ошибкой с ошибкой «Мусор в конце»

static func getUserDetails(withprefixText prefixText: String, withUserName userName:String, withPassword password:String) {
    // Call the web serrvice
    let myURL = URL(string: basePath)
    var request = URLRequest(url: myURL!)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

    let postString = ["prefixText": prefixText, "prefixText1": userName, "prefixText2": password] as [String: String]
    if JSONSerialization.isValidJSONObject(postString) {
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: postString, options: .prettyPrinted)
        }
        catch let error {
            print(error.localizedDescription)
            return
        }
    }

    let task = URLSession.shared.dataTask(with: request, completionHandler: { (data: Data?,response: URLResponse?,error: Error?) in

    if error != nil {
            print("error = \(String(describing: error))")
            return
        }
        do {
            let json = try JSONSerialization.jsonObject(with: data! , options: []) as? [String:Any]
            if let parseJSON = json {
                if let data = parseJSON["data"] as? [[String:Any]] {
                        // Now we can access values by its key
                }

            }
            else {
                print ("Parsing error")
            }
        } catch {
            print("Serilization Error = \(error)")
        }
    })
    task.resume()
}

1 Ответ

0 голосов
/ 05 мая 2018

Ваш веб-сервис принимает параметр как URL-кодирование

поэтому тип контента должен быть

«Content-Type»: «application / x-www-form-urlencoded»

Вы можете сделать это так

let config = NSURLSessionConfiguration.defaultSessionConfiguration()
config.HTTPAdditionalHeaders = [
    "Accept" : "application/json",
    "Content-Type" : "application/x-www-form-urlencoded"
]

let session = NSURLSession(configuration: config)

let request = NSMutableURLRequest(URL: NSURL(string:"BASE_URL_SERVER")!)

// this paramter as example just set your paramter
request.encodeParameters(["name" : "email@email.com", "passwordd":"password"])

let task = session.dataTaskWithRequest(request) { data, response, error in
    guard error == nil && data != nil else {
        print(error)
        return
    }
    // now you can use data to serialize it

}
task.resume()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...