如何使用swift发送Json作为参数在URL中我使用swift语言创建新的

问题描述:

。我在这里看到了一些快速解析Json的问题,但我的问题与其他问题有点不同。 当我写/ cmd =登录& params {'user':'username','password':'pass'}它返回正确的数据。如何快速解决此问题 我发送用户名和密码到url作为json,但 它检索错误,这意味着“无效格式” 请帮助我。 这里是我曾尝试:如何使用swift发送Json作为参数在URL中我使用swift语言创建新的

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

您是否需要以JSON形式发送?为什么不作为?user = username&?password = pass? 我会建议看看Alamofire的Swift HTTP请求。 https://github.com/Alamofire/Alamofire – Chackle

+0

jsonString不是有效的json,它需要是'“{\”params \“:{\”user \“:\”username \“,\”password \ “:\”pass \“}}”''除非它不需要是 – sketchyTech

+0

params = {'user':'username','password':'pass'}它在浏览器中运行良好 – Vidul

你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" 
+0

或者用'{}'包裹成'params'作为唯一键 – Wain

+0

是的,这取决于服务器需要什么。 – skyline75489

+0

如何解决NSURL和String类型的+ =运算符? – Vidul

我不认为你需要按照你的方式来编码你的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" 
+0

不起作用(( – Vidul

假设根据您的疑问,服务器要求的格式是这样的:

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)") 
+0

在NSURL上给出错误 – Vidul

+0

如果你说哪个错误可能有人可以帮到你 – sak

+0

致命错误:意外地发现零,同时展开一个可选值 – Vidul

假设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"