Xcode — Swift — NSURL: & quot; фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения & quot;

Я пытаюсь протестировать реализацию 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

2

Решение

Что происходит, вы вынуждены развернуть 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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]