Как отправить Json в качестве параметра в URL-адресе с помощью Swift

Я новичок в быстром языке. Я рассмотрел здесь некоторые вопросы для быстрого анализа Json, но моя проблема немного отличается от других. когда я пишу /cmd=login¶ms{'user':'username','password':'pass'} он возвращает правильные данные. как решить эту проблему в swift. Я отправляю имя пользователя и пароль на URL-адрес в виде json, но получаю ошибку, что означает «недопустимый формат». Пожалуйста, помогите мне. Вот что я пробовал:

  var url:NSURL = NSURL(string: "http://<host>?cmd=login")!
    //var session = NSURLSession.sharedSession()
    var responseError: NSError?


    var request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 5)

    // var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
    var response: NSURLResponse?
    request.HTTPMethod = "POST"

let jsonString = "params={\"user\":\"username\",\"password\":\"pass\"}"

    request.HTTPBody = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:true)
    request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")

    // send the request
    NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &responseError)

    // look at the response
    if let httpResponse = response as? NSHTTPURLResponse {
        println("HTTP response: \(httpResponse.statusCode)")
    } else {
        println("No HTTP response")
    }
    let task  = NSURLSession.sharedSession().dataTaskWithRequest(request){
        data, response, error in
        if error != nil {
            println("error=\(error)")
            return
        }

        println("****response= \(response)")
        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("**** response =\(responseString)")
        var err: NSError?
        var json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers , error: &err) as? NSDictionary

    }
    task.resume()

person Vidul    schedule 27.04.2015    source источник
comment
Вам нужно отправить в формате JSON? Почему бы не отправить как ?user=username&?password=pass ? Я бы порекомендовал посмотреть Alamofire для HTTP-запросов Swift. github.com/Alamofire/Alamofire   -  person Chackle    schedule 27.04.2015
comment
jsonString не является допустимым json, он должен быть "{\"params\":{\"user\":\"username\",\"password\":\"pass\"}}", если только он не должен быть   -  person sketchyTech    schedule 27.04.2015
comment
params={'user':'username','password':'pass'} он хорошо работает в браузере   -  person Vidul    schedule 27.04.2015
comment
Я думаю, вы должны использовать GET для запроса. Проверьте мой ответ.   -  person skyline75489    schedule 27.04.2015


Ответы (4)


Предполагая, исходя из вашего вопроса, что формат, ожидаемый сервером, выглядит примерно так:

http://<host>?cmd=login&params=<JSON object>

Вам нужно будет сначала URL-кодировать объект JSON, прежде чем добавлять его в строку запроса, чтобы исключить любые недопустимые персонажи.

Вы можете сделать что-то вроде этого:

let jsonString = "{\"user\":\"username\",\"password\":\"pass\"}"
let urlEncoadedJson = jsonString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
let url = NSURL(string:"http://<host>?cmd=login&params=\(urlEncoadedJson)")
person sak    schedule 27.04.2015
comment
Если бы вы сказали, какая ошибка, возможно, кто-то мог бы вам помочь. - person sak; 27.04.2015
comment
фатальная ошибка: неожиданно найдено nil при развертывании необязательного значения - person Vidul; 27.04.2015

Допустим, URL-адрес

https://example.com/example.php?Name=abc&data={ «класс»: «625», «тема»: «английский»}

в Свифт 4

let abc = "abc"
let class = "625"
let subject = "english"



let baseurl = "https://example.com/example.php?"

let myurlwithparams = "Name=\(abc)" + "&data=" +

"{\"class\":\"\(class)\",\"subject\":\"\(subject)\"}"

let encoded = 
myurlwithparams.addingPercentEncoding(withAllowedCharacters: 
.urlFragmentAllowed)

let encodedurl = URL(string: encoded!)

var request = URLRequest(url: encodedurl!)

request.httpMethod = "GET"
person Deep Krishna sharma    schedule 15.02.2018
comment
это выглядит ужасно - person Zaporozhchenko Oleksandr; 04.09.2019
comment
@ZaporozhchenkoAleksandr Предложите улучшение или альтернативу, буду рад узнать, спасибо - person Deep Krishna sharma; 19.02.2020

Я не думаю, что вам нужно кодировать JSON так, как вы это делаете. Ниже должно работать.

let jsonString = "params={\"user\":\"username\",\"password\":\"pass\"}"
var url:NSURL = NSURL(string: "http://<host>?cmd=login&?\(jsonString)")!
//var session = NSURLSession.sharedSession()
var responseError: NSError?


var request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 5)

// var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
var response: NSURLResponse?
request.HTTPMethod = "POST"
person Chackle    schedule 27.04.2015

Ваша строка json недействительна, она должна быть такой:

let jsonString = "{\"user\":\"username\",\"password\":\"pass\"}"

Что касается запроса, я думаю, что GET это то, что вам действительно нужно:

var urlString = "http://<host>" // Only the host
let payload = "?cmd=login&params=" + jsonString // params goes here
urlString += payload
var url:NSURL = NSURL(string: urlString)! 
// ...
request.HTTPMethod = "GET"
person skyline75489    schedule 27.04.2015
comment
Или завернуть в {}, чтобы он был объектом с params в качестве единственного ключа - person Wain; 27.04.2015
comment
Да, зависит от того, что хочет сервер. - person skyline75489; 27.04.2015
comment
как разрешить оператор += для типов NSURL и String? - person Vidul; 27.04.2015
comment
@Vidul Это тривиально. Мое новое редактирование является примером. Может быть, вы придумаете лучший способ. - person skyline75489; 27.04.2015