【问题标题】:POST Request in Swift with key-value pairs带有键值对的 Swift 中的 POST 请求
【发布时间】:2015-01-28 00:01:59
【问题描述】:

我必须在 Swift 中发出发布请求并接收响应。我需要以键值对格式向请求添加值,然后我得到一个答案(0 或 1)。我不知道如何将 Dictionary 值添加到请求中。:

    var url = NSURL(string:"www.myurl.com")
    var request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "POST"
    var params = ["email":"\(txtEmail.text)", "passw":"\(txtPassword.text)"] as Dictionary
    let data = //HOW CAN I LOAD THE DATA TO THE HTTPBODY REQUEST??
    request.HTTPBody = data
    var connection = NSURLConnection(request: request, delegate: self, startImmediately: false)

提前致谢。

【问题讨论】:

  • 见stackoverflow.com/a/25154803/1271826。我认为这种替代方案NSURLQueryItem solution 如果仅针对iOS 8,则非常优雅和诱人,但它不能正确处理+ 字符(即,如果密码中有+,它将无法正常工作)。
  • 发送的数据应该是什么格式? JSON? URL形式编码? @Rob 的回答在 URL 格式编码时很有帮助,如果是 JSON,您可以使用 NSJSONSerialization。

标签: ios xcode post swift key-value


【解决方案1】:

解决方案。感谢@Rob:

func loginRequest(url:String, withParams params: [String: String?], postCompleted : (succeeded: Bool, msg: String) -> ()){
    var request = NSMutableURLRequest(URL: NSURL(string: url)!)
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"

    var err: NSError?
    var bodyData = ""
    for (key,value) in params{
        if (value == nil){ continue }
        let scapedKey = key.stringByAddingPercentEncodingWithAllowedCharacters(
            .URLHostAllowedCharacterSet())!
        let scapedValue = value!.stringByAddingPercentEncodingWithAllowedCharacters(
            .URLHostAllowedCharacterSet())!
        bodyData += "\(scapedKey)=\(scapedValue)&"
    }

    request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)

    var task = session.dataTaskWithRequest(request,
        completionHandler: {data, response, error -> Void in
            let dataString = NSString(data: data, encoding: NSUTF8StringEncoding)
            postCompleted(succeeded: true, msg: dataString!)
    })
    task.resume()
}

然后,我调用该函数,我就可以知道用户是否正确:

        self.loginRequest("http:myurl.com",
            withParams: ["email":"email","passw":"passw"])
        {
            (succeeded: Bool, msg: String) -> () in
            if(succeeded) {
                if msg == "0"
                {
                    //Incorrect data...
                }
                else
                {
                    //The login it's ok...
                }
            }
        }

【讨论】:

    【解决方案2】:

    更新了 Swift 4 的代码 + 小改进。基于@imj 的工作。

    /// Converts the dictionary to key values
    func convertToParameters(_ params: [String: String?]) -> String {
        var paramList: [String] = []
    
        for (key, value) in params {
            guard let value = value else {
                continue
            }
    
            guard let scapedKey = key.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else {
                print("Failed to convert key \(key)")
                continue
            }
    
            guard let scapedValue = value.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else {
                print("Failed to convert value \(value)")
                continue
            }
    
            paramList.append("\(scapedKey)=\(scapedValue)")
        }
    
        return paramList.joined(separator: "&")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多