У меня очень похожая проблема, как в том, почему тело запроса HTTP-сообщения всегда завернуто дополнительным текстом в приложении Swift, но я не могу применить решение из этого потока к моему коду, потому что у меня нет request.setValue. Кто-нибудь знает, что мне нужно сделать, чтобы избавиться от Необязательного? Мой код:
@IBAction func LoginButtonTapped(sender: UIButton) { let username = UsernameTextField.text let password = PasswordTextField.text if(username!.isEmpty || password!.isEmpty) {return; } let request = NSMutableURLRequest (URL: NSURL(string: "http://myip/loginregister.php")!) request.HTTPMethod = "POST" let postString = "username=\(username)&password=\(password)" request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in guard error == nil && data != nil else { // check for fundamental networking error print("error=\(error)") return } let data = postString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! do { if let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary { let success = json["success"] as? Int // Okay, the `json` is here, let's get the value for 'success' out of it print("Success: \(success)") } else { let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) // No error thrown, but not NSDictionary print("Error could not parse JSON: \(jsonStr)") } } catch let parseError { print(parseError) // Log the error thrown by `JSONObjectWithData` let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) print("Error could not parse JSON: '\(jsonStr)'") } } task.resume()
Вы должны развернуть значение, когда сначала получите текст из UITextField, потому что свойство text
UITextField
допускает nil
let username = UsernameTextField.text! let password = PasswordTextField.text!
Объясни подробней
Когда вы разворачиваете text
UITextField, username
и password
будут not nil
. Код сравнения пустым должен быть:
if(username.isEmpty || password.isEmpty) {return }
Если вы не разворачиваете, когда вы используете это "\(username)"
, вы пытаетесь преобразовать nil
объект в строку, поэтому результат строки будет добавлен с текстом «Необязательный».
Чтобы решить проблему с Content-Type для запроса
Вставьте эту строку в свой код. Я не считаю, что у вас нет метода setValue
.
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField:"Content-Type")