Swift 原生网络请求

iOS HTTP请求原生组要的类是URLSession,是一个单例类。

  • 例1:GET
func makeLogon() {
	// 构建URL
    let url:URL = URL(string: "https://xxx/xxx/API?xxx")!
    // 发送HTTP请求的的session对象
    let session = URLSession.shared
    // 构建请求request
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    // 发一个get请求
    let task = session.dataTask(with: request as URLRequest) {(
        data, response, error) in
        
        guard let data = data, let _:URLResponse = response, error == nil else {
            print("error")
            return
        }
        let dataString =  String(data: data, encoding: String.Encoding.utf8)
        let dict = self.getDictionaryFromJSONString(jsonString: dataString!)
        print(dict)
    }
    task.resume()
}

func getDictionaryFromJSONString(jsonString:String) ->NSDictionary{
    let jsonData:Data = jsonString.data(using: .utf8)!
    let dict = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)
    if dict != nil {
        return dict as! NSDictionary
    }
    return NSDictionary()
}
  • 例2 POST
func makeUpdateCountSheet() {
	// 这里直接使用 jsonString 转成字典,然后转成 Data,将 流 放到 request的 httpBody中, 模拟发送一个http请求
    let jsonString = "{\"Data\":{\"xxx\":\"834\",\"xxx\":[{\"xxx\":[{\"xxx\":\"031019\",\"xxx\":\"ADD\",\"xxx\":\"9\"},{\"xxx\":\"5651G-06920ADBAA\",\"xxx\":\"ADD\",\"xxx\":\"6\"}],\"xxx\":\"xxx\",\"Counted\":true,\"xxx\":true,\"LineNum\":\"1\",\"xxx\":\"235\",\"Quantity\":\"15\"}],\"xxx\":\"\",\"Initials\":\"we\",\"xxx\":true},\"xxx\":\"\"}"
    let dict = self.getDictionaryFromJSONString(jsonString: jsonString)
    print(dict)
    var  jsonData = NSData()
    do {
         jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) as NSData
    } catch {
        print(error.localizedDescription)
    }
	// 构建URL
    let url:URL = URL(string: "https://xxx/xxx/API?xxx")!
    // session
    let session = URLSession.shared
    // request
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    // 设置Content-Length,非必须
    request.setValue("\(jsonData.length)", forHTTPHeaderField: "Content-Length")
    // 设置 Content-Type 为 json 类型
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    // POST	请求将 数据 放置到 请求体中
    request.httpBody = jsonData as Data
    // 发送请求
    let task = session.dataTask(with: request as URLRequest) {(
        data, response, error) in

        guard let data = data, let _:URLResponse = response, error == nil else {
            print("error")
            return
        }
        // 返回值 utf8 转码
        let dataString =  String(data: data, encoding: String.Encoding.utf8)
        // 将 jsonString 转成字典
        let dict = self.getDictionaryFromJSONString(jsonString: dataString!)
        print(dict)
    }
    task.resume()
}

表象上GET请求体中没有数据,参数都在URL中,而POST请求将数据放置到请求体中。本质上GET和POST是没什么区别的,所以上面两个例子其实是一样一样的。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值