如何使用 swift 在 url 中发送 Json 作为参数
Posted
技术标签:
【中文标题】如何使用 swift 在 url 中发送 Json 作为参数【英文标题】:How to send Json as parameter in url using swift 【发布时间】:2015-04-27 12:10:47 【问题描述】:我是 Swift 语言的新手。我在这里查看了一些用于快速解析 Json 的问题,但我的问题与其他问题略有不同。 当我写 /cmd=login¶ms'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
提出请求。看看我的回答。
【参考方案1】:
根据您的问题假设服务器期望的格式是这样的:
http://<host>?cmd=login¶ms=<JSON object>
您需要先URL-encode JSON 对象,然后再将其附加到查询字符串以消除任何非法字符。
你可以这样做:
let jsonString = "\"user\":\"username\",\"password\":\"pass\""
let urlEncoadedJson = jsonString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
let url = NSURL(string:"http://<host>?cmd=login¶ms=\(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¶ms=" + jsonString // params goes here
urlString += payload
var url:NSURL = NSURL(string: urlString)!
// ...
request.HTTPMethod = "GET"
【讨论】:
或者包裹在
中成为一个以params
为唯一键的对象
是的,取决于服务器想要什么。
如何解析 NSURL 和 String 类型的 += 运算符?
@Vidul 这很简单。我的新编辑就是一个例子。也许你能想出一个更好的办法。以上是关于如何使用 swift 在 url 中发送 Json 作为参数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Alamofire SWIFT 在 post api 中发送 JSON
如何在 swift4 中使用 Rxalamofire 发送 URL 请求
如何在 swift 3 中使用 Alamofire 制作和发送字典数组(JSON 格式)发送到服务器