2015-04-27 26 views
-2

。我在這裏看到了一些快速解析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

回答

0

你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

0

我不認爲你需要按照你的方式來編碼你的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

2

假設根據您的疑問,服務器要求的格式是這樣的:

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

0

假設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" 
相關問題