好记性不如烂笔头(三)

时间:2021-06-18 19:57:17

SwiftHTTP发送Http请求

刚学 iOS,利用SwiftHTTP来发送Http请求,就遇到一个坑,还是得记一下,以便以后回顾及查找:

    func postWithSwiftHTTP() {
let url = "http://ip:port/api"
let params = ["param" : paramTextField.text!]
do {
let opt = try HTTP.POST(url, parameters: params)
opt.start { response in
if let error = response.error {
print("error : \(error.localizedDescription)")
return
}
}
} catch let error {
print("got an error creating the reqeust : \(error)")
}
}

坑在哪呢?
就在参数设置这里,如果直接将paramTextField.text设置给params的话,如下:

let params = ["param" : paramTextField.text]

则此时发送的请求,参数是不合法的(todo: 抓包看一下请求), response就会一直是Bad Request的400错误,在这里愣了好久,T_T

后来想一下,难道这个值必须是明确的值才可以?,于是利用 ! 将其变成一个明确的值尝试一下,突然就通了。。。,如下

let params = ["param" : paramTextField.text!]

或者先将值给取出来

let param = paramTextField.text ?? ""
let params = ["param" : param]

用NSURLSession发送请求

上面用的SwiftHTTP是第三方库,而NSURLSession是swift本身提供的api, 用法如下:

    func postWithURLSession() {
let param = paramTextField.text ?? ""
let request = NSMutableURLRequest(URL: NSURL(string: "http://ip:port/api")!)
request.HTTPMethod = "POST"
let postString = "param=\(param)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}

print("response = \(response)")
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString!)")

}
task.resume()

}

iOS9.0中使用模拟器来发送Http请求

必须在info.plist中添加以下参数:
1. App Transport Security Settings
类型是Dictonary
2. 在其Item下面添加一个Allow Arbitrary Load
值设置为YES

如果不进行此设置,访问http请求有可能会错误,原因在于iOS9中引入了新特性 App Transport Security, 要求App内部访问的网络必须使用Https协议。