Я пытаюсь протестировать реализацию OAuth2 в Xcode Playground, используя PHP API и клиент Swift. В основном мой код выглядит так
let url = NSURL(string: "http://localhost:9142/account/validate")!
var request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"request.HTTPBody!.setValue("password", forKey: "grant_type")
// Other values set to the HTTPBody
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, error) in
// Handle response here
}
Но я продолжаю получать эту ошибку, когда я создаю экземпляр переменной url:
фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения
Я пытался не распаковывать его, когда создаю его экземпляр, а когда я его использую, он ничего не изменил, ошибка появляется при первом развертывании.
Это становится еще более странным.
let url = NSURL(string: "http://localhost:9142/account/validate")!
println(url)
выходы
HTTP: // локальный: 9142 / счет / Validate
фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения
Я действительно не понимаю, откуда может возникнуть ошибка, так как я действительно новичок в Swift
Что происходит, вы вынуждены развернуть HTTPBody, который установлен в ноль, вызывая ошибку времени выполнения в этой строке:
request.HTTPBody!.setValue("password", forKey: "grant_type")
Вам нужно создать объект NSData для вашего тела запроса, а затем назначить его для request.HTTPBody согласно следующему коду:
let url = NSURL(string: "http://localhost:9142/account/validate")!
var request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
// Create a parameter dictionary and assign to HTTPBody as NSData
let params = ["grant_type": "password"]
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.allZeros, error: nil)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, error) in
// Handle response here
}
Я надеюсь, что это поможет решить вашу проблему.
Чтобы сериализовать данные без использования сериализатора JSON, вы можете создать свой собственный, подобный приведенному ниже:
func dataWithParameterDictionary(dict: Dictionary<String, String>) -> NSData? {
var paramString = String()
for (key, value) in dict {
paramString += "\(key)=\(value)";
}
return paramString.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: false)
}
и назовите это так:
let dict = ["grant_type": "password"]
let data = dataWithParameterDictionary(dict)
request.HTTPBody = data
Других решений пока нет …