IOのAPIとの接続にAlamofireライブラリを使用しています。接続の1つに問題があり、それが本体にエンコードされたデータが原因であるのか、それ以外の原因であるのかがわかりません。私のエラーを検出するために、正しいデータ構造を送信しているかどうかを確認するためのリクエスト本文をコンソールに出力しようとしています。
私のコードは次のとおりです:
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)
}
}
}
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リクエストへのパラメーターをより効率的な方法で含めることができるかどうかを知りたいです(Userオブジェクトを解析し、パラメーター変数を置き換えるなど)。
私の問題について何か考えはありますか?
編集:
@Travisの提案に従って、ようやくリクエスト本文を印刷するためのソリューションを見つけました。以下にコードを示します。
println("request body: \(NSString(data:req.HTTPBody!, encoding:NSUTF8StringEncoding) as String?)")
動作しないオブジェクトをパラメーターとして渡すことについては、公式のドキュメントに従いましたが、できました。
最初の質問に対する答えは、
println("request body: \(request.HTTPBody)")
2番目の質問に関する限り、APIパラメータの抽象化に関するセクション全体と、CRUDと承認が Alamofireメインページ にあります。
Swift 3 +の場合
print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue))
ログを印刷するためのリクエストクラスの以下の拡張機能を追加しました。
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
少し簡単にするだけです。
if let requestBody = request.request?.HTTPBody {
do {
let jsonArray = try NSJSONSerialization.JSONObjectWithData(requestBody, options: [])
print("Array: \(jsonArray)")
}
catch {
print("Error: \(error)")
}
}
Swift 4&Swift 5の場合、そのように:
String(data: data!, encoding: String.Encoding.utf8)
DefaultDataResponse拡張機能またはオブジェクトにない場合は、データをyourObject.response.dataに置き換えます