Swift 中的 HTTP POST 请求

Posted

技术标签:

【中文标题】Swift 中的 HTTP POST 请求【英文标题】:HTTP POST request in Swift 【发布时间】:2015-08-20 12:53:25 【问题描述】:

如何在 ios 上发布请求?实际上,当我登录 Facebook 时,它会从登录位置(纬度、经度)获取用户信息,例如用户名。是否可以使用api 链接:http://buddysin.aumkiiyo.com/fbc

我的代码是:

@IBAction func btnAPI(sender: UIButton)

    //startConnection()
    connectToWebAPI()

func connectToWebAPI()
 
    //setting up the base64-encoded credentials
    let id = "1620912344817986"
    //let password = "pass"
    let loginString = NSString(format: "%@:%@", id)
    let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!
    let base64LoginString = loginData.base64EncodedStringWithOptions(nil)

    //creating the requestz
    let url = NSURL(string: "http://buddysin.aumkiiyo.com/fbc")
    var request = NSMutableURLRequest(URL: url!)
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession.sharedSession()
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    let urlConnection = NSURLConnection(request: request, delegate: self)
    request.HTTPMethod = "POST"
    request.setValue(base64LoginString, forHTTPHeaderField: "Authorization")

    let task = session.dataTaskWithURL(url!, completionHandler: data, response, error -> Void in
        if (error != nil) 
            println(error)
        
        else 
            // converting the data into Dictionary
            var error: NSError?
            let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as! NSDictionary

            println(jsonResult)
        
    )

    //fire off the request  

    task.resume()

当我运行时,致命错误显示为

`fatal error: unexpectedly found nil while unwrapping an Optional value`

在“jsonResult”中

【问题讨论】:

您在哪一行收到此错误? 让 jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as! NSDictionary 试试if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as?NSDictionary println(jsonResult) 当我更改代码时没有错误显示它显示“nil” 在我的 o/p 中显示:Optional( share = message = " API AUTH FailD"; status = "-1"; ; ) 【参考方案1】:

我认为最好使用Alomafire。作为 Objective-C 中的 AFNetWorking,它是一个大大简化了 http 请求的库。

【讨论】:

下载 alomafire 后应该做什么 当您在 XCode 项目中添加 Alomafire 时。您可以在 github 中找到一些示例。例如制作 http.post 的示例:link【参考方案2】:

访问this问题以检查我的请求后功能(如果 您出于任何原因不想使用 Alamofire)

访问 this 问题以检查您需要执行的步骤,如果您 想要将 Alamofire 添加到您的 XCode 项目中

如果您需要从服务器获取 json 数据,请使用SwiftyJSON。就像把 SwiftyJSON.swift 拖进去一样简单 您的项目,检查“如果需要,复制项目”并使用类似

让 jsonData = JSON(data: yourDataFromServer)

您还可以查看this 问题以了解编码步骤 json-post 数据发送到服务器。

希望我能帮上忙:)

【讨论】:

如果我不使用 alamofire @SwiftStudier,我应该在哪里创建 php 文件 您不必这样做。这只是示例 我回答了你的问题。您的服务身份验证问题不符合本主题,这是您自己的问题 好的,我应该如何显示记录的用户详细信息,请告诉.. 实际上在那个例子中,他们预定义了设置值,但我想在服务器运行时获取并显示详细信息是否可能? 你的问题是关于 swift 中的 HTTP POST 请求,不是吗?【参考方案3】:

您应该找到由于此错误而导致的哪个变量: 例如data,

if let dataTemp = data as? NSDictionary 

仅供参考: 这是AFNetworking的'POST'方法在swift中的一种方式,下面的代码应该在你的connectToWebAPI方法中,将你的url包装成NSURL。

let manager = AFHTTPRequestOperationManager(baseURL: NSURL(string: yourURL))
manager.POST("path", parameters: ["key":value], success:  (opeartion:AFHTTPRequestOperation!, data:AnyObject!) -> Void in
        ,failure:  (operation:AFHTTPRequestOperation!, error:NSError!) -> Void in

    )

安装教程AFNetworking。 https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking

【讨论】:

所以我应该完全改写代码!!我必须在哪里粘贴这段代码。我不知道这段代码。 如果我在我的 connectToWebAPI() 中实现此代码,它会显示一些错误,例如 /* Use of Unresolved AFHTTPRequestOperationManager / , / Use of declared type AFHTTPRequestOperation */ 。我应该如何解决这些错误。 哦,IOS开发建议使用AFNetworking进行http/https。几乎没有与后端/API 交互的应用不会使用它。【参考方案4】:

Alamofire 很容易做到

  func postSomething(completionHandler: @escaping CompletionHandler)
    let loginString = NSString(format: "%@:%@", id)
    let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!
    let base64LoginString = loginData.base64EncodedStringWithOptions(nil)

    let headers: HTTPHeaders = [
        "Content-Type": "application/json",
        "Accept": "application/json",
        "Authorization": "base64LoginString",
    ]

    let parameters: Parameters = [
        "parameter": value,
        "parameter2": value2
    ]

    Alamofire.request("http://buddysin.aumkiiyo.com/fbc", method: .post, parameters: parameters, encoding: URLEncoding.default, headers: SFAppServicesManager.sharedInstance.genericHeader()).responseJSON  response in
        if let JSON = response.result.value 
            let userDictionary = JSON as! NSDictionary
            completionHandler(true)
         else 
            completionHandler(false)
        
    

【讨论】:

以上是关于Swift 中的 HTTP POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

Swift Alamofire 无法解析 POST 请求中的响应 JSON 字符串

发送 POST 请求后控制台中的消息

Swift&NodeJS 使用Alamofire进行Post(zhuan)

Swift-4:如何使用带有“Content-Type”的 URLSession 中的参数的 POST 请求获取数据:“application/x-www-form-urlencoded”

Swift 3:Alamofire POST 请求参数问题

在 Swift 中使用 JSON 正文发出 HTTP Post 请求