发布请求始终由可选文本包装


Post request always wrapped by optional text

我有一个非常相似的问题,例如为什么 http post 请求正文总是被 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 获取文本时必须解开该值的包装,因为 UITextFieldtext 属性允许nil

let username = UsernameTextField.text!
let password = PasswordTextField.text!

解释更多

当您解开 UITextField 的text时,usernamepasswordnot nil变量。代码比较空应为:

if(username.isEmpty || password.isEmpty) {return }

如果不解开包装,则在使用此"'(username)"时,将尝试将nil对象转换为字符串,因此字符串结果将附加"可选"文本。

解决请求的内容类型问题

将此行粘贴到代码中。我不相信你没有setValue方法。

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField:"Content-Type")