【问题标题】:How to send Json as parameter in url using swift如何使用 swift 在 url 中发送 Json 作为参数
【发布时间】:2015-04-27 12:10:47
【问题描述】:

我是 Swift 语言的新手。我在这里查看了一些用于快速解析 Json 的问题,但我的问题与其他问题略有不同。 当我写 /cmd=login&params{'user':'username','password':'pass'} 它返回正确的数据。如何迅速解决这个问题 我将用户名和密码作为 json 发送到 url 但是 它检索错误,这意味着“格式无效” 请帮我。 这是我尝试过的:

  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()

【问题讨论】:

  • 您需要以 JSON 格式发送吗?为什么不发送为 ?user=username&?password=pass ?我建议查看 Alamofire 的 Swift HTTP 请求。 github.com/Alamofire/Alamofire
  • jsonString 不是有效的 json,它需要是 "{\"params\":{\"user\":\"username\",\"password\":\"pass\"}}",除非它不需要是
  • params={'user':'username','password':'pass'} 在浏览器中运行良好
  • 我认为您应该使用GET 提出请求。看看我的回答。

标签: ios swift nsurlconnection swifty-json


【解决方案1】:

根据您的问题假设服务器期望的格式是这样的:

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

您需要先URL-encode JSON 对象,然后再将其附加到查询字符串以消除任何非法字符。

你可以这样做:

let jsonString = "{\"user\":\"username\",\"password\":\"pass\"}"
let urlEncoadedJson = jsonString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
let url = NSURL(string:"http://<host>?cmd=login&params=\(urlEncoadedJson)")

【讨论】:

  • 如果你说哪个错误也许有人可以帮助你。
  • 致命错误:在展开可选值时意外发现 nil
【解决方案2】:

假设 url 是

https://example.com/example.php?Name=abc&data={"class":"625","subject":"english"}

在 Swift 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"

【讨论】:

  • 这看起来很可怕
  • @ZaporozhchenkoAleksandr 建议改进或替代方案,很高兴知道,谢谢
【解决方案3】:

我认为您不需要按照自己的方式对 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"

【讨论】:

    【解决方案4】:

    你的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"
    

    【讨论】:

    • 或者包裹在{}中成为一个以params为唯一键的对象
    • 是的,取决于服务器想要什么。
    • 如何解析 NSURL 和 String 类型的 += 运算符?
    • @Vidul 这很简单。我的新编辑就是一个例子。也许你能想出一个更好的办法。
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多