AFNetworking
を使用してPOSTを介してサーバーと通信し、必要な情報を含む単純な文字列で応答します。次のコードを使用しています。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST: MY_URL
parameters: MY_PARAMETERS
success:^(AFHTTPRequestOperation *operation, id responseObject) {
//do something
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//etc.
}];
ただし、リクエストを実行すると次のエラーが発生するため、AFNetworking
はすべての応答がJSON形式であると想定しているようです。
エラードメイン= NSCocoaErrorDomainコード= 3840 "操作を完了できませんでした。(Cocoaエラー3840)"(JSONテキストが配列またはオブジェクトで開始されておらず、フラグメントを設定できないようにするオプションがあります。)UserInfo = 0x1566eb00 {NSDebugDescription = JSON text配列またはオブジェクトと、フラグメントを設定できないようにするオプションで開始されませんでした。}
応答がJSONオブジェクトでなくても問題ないことをAFNetworking
に伝えるにはどうすればよいですか? AFHTTPClient
に関連するものを見たことがありますが、それはAFNetworking
の一部ではなくなったようです。
AFHTTPRequestOperationManager
またはAFHTTPSessionManager
に応答の処理方法を指示できます。 POST
を呼び出す前に、次の操作を実行できます。
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
次に、success
ブロックで、NSData
を文字列に変換できます。
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
そうは言っても、JSON応答を返すようにWebサービスを変換することを検討することをお勧めします。その方法で解析する方がはるかに簡単です(有効な応答とサーバーエラーを区別するため)。
NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
以下のような応答の説明の詳細を取得できます
NSLog(@"JSON: %@", [responseObject description]);
はるかに良い方法は、サブクラス化AFHTTPResponseSerializerであり、そこでオーバーライドすることです。
func responseObject(応答の場合:URLResponse ?、データ:データ?、エラー:NSErrorPointer)->任意?
そこで、応答を解析し、必要なタイプにキャストして返すことができます。