打印 Alamofire 请求正文
Print Alamofire request body
我正在使用 Alamofire 库连接 iOs 中的 API。我在其中一个连接中遇到问题,我不知道是因为正文中编码的数据还是其他原因。为了检测我的错误,我尝试在控制台中打印请求正文以检查我是否发送了正确的数据结构。
我的代码如下:
func updateUser (#user: User, completionHandler: (responseObject: User?, error: AnyObject?) -> ()) {
let parameters = [
"_id": "\(user._id!)",
"email": "\(user.email!)",
"media": "\(Mapper().toJSONArray(user.media!))",
"blogs": "\(Mapper().toJSONArray(user.blogs!))"
]
var manager = Alamofire.Manager.sharedInstance
manager.request(.PUT, apiUrl + "/route/to/api", parameters: parameters, encoding: .JSON)
.responseObject{ (req: NSURLRequest, res: NSHTTPURLResponse?, user: User?, data: AnyObject?, error: NSError?) in
if(error != nil) {
NSLog("Error API updateUser: \(error)")
}
else {
completionHandler(responseObject: user as User?, error: data)
}
}
}
User 是一个 Mappable 对象,因为我将 ObjectMapper 与 Alamofire 结合使用。用户由以下代码定义:
class User: Mappable {
var _id: String?
var name: String?
var media: [Media]?
init(_id: String, name: String, media: [Media]){
self._id = _id;
self.name = name;
self.media = media
}
required init=(_ map: Map){
mapping(map)
}
func mapping(map: Map){
_id <- map["_id"]
name <- map["name"]
media <- map["media"]
}
}
媒体的定义类似于用户,但具有不同的变量。
此外,我想知道,除了打印请求正文之外,我是否可以以更有效的方式将参数包含到 Alimofire 请求中(比如解析用户对象并将其替换为参数变量)
知道我的问题吗?
编辑:
按照@Travis的建议,终于找到了打印请求体的解决方案。您可以在下面找到代码:
println("request body: \(NSString(data:req.HTTPBody!, encoding:NSUTF8StringEncoding) as String?)")
关于将对象作为参数传递我无法使用,我按照官方文档进行操作,但我可以使用。
第一个问题的答案是,
println("request body: \(request.HTTPBody)")
就您的第二个问题而言,API 参数抽象以及 Alamofire main page 上的 CRUD 和授权有一整节。
只是为了让它更容易一些。
if let requestBody = request.request?.HTTPBody {
do {
let jsonArray = try NSJSONSerialization.JSONObjectWithData(requestBody, options: [])
print("Array: \(jsonArray)")
}
catch {
print("Error: \(error)")
}
}
对于Swift 3+
print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue))
为打印日志的请求 class 添加了以下扩展。
extension Request {
public func debugLog() -> Self {
#if DEBUG
debugPrint("=======================================")
debugPrint(self)
debugPrint("=======================================")
#endif
return self
}
}
要使用扩展,只需在定义请求后使用 debugLog(),如下所示:
Alamofire.request(url).debugLog()
.responseJSON( completionHandler: { response in
})
参考 url : link
对于Swift 4 & Swift 5,就这样:
String(data: data!, encoding: String.Encoding.utf8)
如果不在 DefaultDataResponse 扩展或对象中,将数据替换为 yourObject.response.data
Swift 5
print(response.debugDescription)
来自此处的 Alamofire 文档 https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output
您可以获得curl请求描述
AF.request("https://httpbin.org/get")
.cURLDescription { description in
print(description)
}
.responseDecodable(of: DecodableType.self) { response in
debugPrint(response.metrics)
}
我正在使用 Alamofire 库连接 iOs 中的 API。我在其中一个连接中遇到问题,我不知道是因为正文中编码的数据还是其他原因。为了检测我的错误,我尝试在控制台中打印请求正文以检查我是否发送了正确的数据结构。
我的代码如下:
func updateUser (#user: User, completionHandler: (responseObject: User?, error: AnyObject?) -> ()) {
let parameters = [
"_id": "\(user._id!)",
"email": "\(user.email!)",
"media": "\(Mapper().toJSONArray(user.media!))",
"blogs": "\(Mapper().toJSONArray(user.blogs!))"
]
var manager = Alamofire.Manager.sharedInstance
manager.request(.PUT, apiUrl + "/route/to/api", parameters: parameters, encoding: .JSON)
.responseObject{ (req: NSURLRequest, res: NSHTTPURLResponse?, user: User?, data: AnyObject?, error: NSError?) in
if(error != nil) {
NSLog("Error API updateUser: \(error)")
}
else {
completionHandler(responseObject: user as User?, error: data)
}
}
}
User 是一个 Mappable 对象,因为我将 ObjectMapper 与 Alamofire 结合使用。用户由以下代码定义:
class User: Mappable {
var _id: String?
var name: String?
var media: [Media]?
init(_id: String, name: String, media: [Media]){
self._id = _id;
self.name = name;
self.media = media
}
required init=(_ map: Map){
mapping(map)
}
func mapping(map: Map){
_id <- map["_id"]
name <- map["name"]
media <- map["media"]
}
}
媒体的定义类似于用户,但具有不同的变量。
此外,我想知道,除了打印请求正文之外,我是否可以以更有效的方式将参数包含到 Alimofire 请求中(比如解析用户对象并将其替换为参数变量)
知道我的问题吗?
编辑:
按照@Travis的建议,终于找到了打印请求体的解决方案。您可以在下面找到代码:
println("request body: \(NSString(data:req.HTTPBody!, encoding:NSUTF8StringEncoding) as String?)")
关于将对象作为参数传递我无法使用,我按照官方文档进行操作,但我可以使用。
第一个问题的答案是,
println("request body: \(request.HTTPBody)")
就您的第二个问题而言,API 参数抽象以及 Alamofire main page 上的 CRUD 和授权有一整节。
只是为了让它更容易一些。
if let requestBody = request.request?.HTTPBody {
do {
let jsonArray = try NSJSONSerialization.JSONObjectWithData(requestBody, options: [])
print("Array: \(jsonArray)")
}
catch {
print("Error: \(error)")
}
}
对于Swift 3+
print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue))
为打印日志的请求 class 添加了以下扩展。
extension Request {
public func debugLog() -> Self {
#if DEBUG
debugPrint("=======================================")
debugPrint(self)
debugPrint("=======================================")
#endif
return self
}
}
要使用扩展,只需在定义请求后使用 debugLog(),如下所示:
Alamofire.request(url).debugLog()
.responseJSON( completionHandler: { response in
})
参考 url : link
对于Swift 4 & Swift 5,就这样:
String(data: data!, encoding: String.Encoding.utf8)
如果不在 DefaultDataResponse 扩展或对象中,将数据替换为 yourObject.response.data
Swift 5
print(response.debugDescription)
来自此处的 Alamofire 文档 https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output
您可以获得curl请求描述
AF.request("https://httpbin.org/get")
.cURLDescription { description in
print(description)
}
.responseDecodable(of: DecodableType.self) { response in
debugPrint(response.metrics)
}