最近做的项目其中有一条增加联系人的需求,,而且要求是传json格式的字符串给后台,而且字符串是一个字典类型的,首先项目用OC写的,弄了段时间终于成功了,然后今天使用swift重新写项目玩,swift发送JSON数据给服务器在网上找了半天都没有找到答案,经过努力终于实现了弄了几个小时终于弄通了.在此分享一下,而且有个alamofire的问题向各位大神请教.
问题:在使用alamofire发送请求时候,调用发送json格式总是报错,求答案!!!
网上找答案是:encoding:ParameterEncoding.JSON,但是我怎么用怎么改都是错...,最后使用了AFN框架才实现了功能.
首先讲下OC中发送JSON格式数据给服务器:如下图↓
在此说明一个问题:关于AFN内存泄漏问题
// AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
使用上面方式请求数据会导致内存泄漏,因为他不是一个单例!所以开发中我们要将AFHTTPSessionManager写成单例再去调用,昨天instrument测试无意间发现的,网上很多这个答案
AFHTTPSessionManager *mgr = [self getManager];(自己写的一个单例)
mgr.requestSerializer = [AFJSONRequestSerializer serializer];(发送json格式给后台)
下面要说的是: swift发送json格式字符串给后台,使用AFN,如下图 ↓
如果请求要设置请求头,切记一定要讲请求头设置放在manager.requestSerializer = AFJSONRequestSerializer()之后,我就因为放在之前调试了很久...
调用方法:至此调用json格式请求给服务器就成功了!!!
贴代码:方便使用:
class HJNetworkManager: AFHTTPSessionManager {
static let shared = HJNetworkManager()
func json_request(method:HJHTTPMethod = .POST, URLString:String, parameters:[String : AnyObject]?,headerValue:String, completion:@escaping (_ json :AnyObject?, _ :Bool) -> ()){
// 成功回调
let success = { (task:URLSessionDataTask ,json:Any?)->Void in
completion(json as AnyObject?, true)
}
// 失败回调
let failure = { (task:URLSessionDataTask?, error:Error)->() in
print("网络请求错误:\(error)")
completion(nil, false)
}
let manager = AFHTTPSessionManager()
// json请求
manager.requestSerializer = AFJSONRequestSerializer()
// 设置请求头
manager.requestSerializer.setValue(headerValue, forHTTPHeaderField: "token")
if method == .POST {
manager.post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
}else{
manager.get(URLString, parameters: parameters, progress: nil, success: success, failure: failure )
}
}
}
仅供大家参考,不正确之处望大神批评指正,大家一起进步!~☺️
网友评论