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 拖进去一样简单 您的项目,检查“如果需要,复制项目”并使用类似
您还可以查看this 问题以了解编码步骤 json-post 数据发送到服务器。让 jsonData = JSON(data: yourDataFromServer)
希望我能帮上忙:)
【讨论】:
如果我不使用 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 字符串
Swift&NodeJS 使用Alamofire进行Post(zhuan)
Swift-4:如何使用带有“Content-Type”的 URLSession 中的参数的 POST 请求获取数据:“application/x-www-form-urlencoded”