web-dev-qa-db-ja.com

AFNetworking(JSONなし)でPOSTリクエストから単純な文字列を読み取る方法

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の一部ではなくなったようです。

16
Haiku Oezu

AFHTTPRequestOperationManagerまたはAFHTTPSessionManagerに応答の処理方法を指示できます。 POSTを呼び出す前に、次の操作を実行できます。

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

次に、successブロックで、NSDataを文字列に変換できます。

NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

そうは言っても、JSON応答を返すようにWebサービスを変換することを検討することをお勧めします。その方法で解析する方がはるかに簡単です(有効な応答とサーバーエラーを区別するため)。

46
Rob
  NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

以下のような応答の説明の詳細を取得できます

 NSLog(@"JSON: %@", [responseObject description]);
2
codercat

はるかに良い方法は、サブクラス化AFHTTPResponseSerializerであり、そこでオーバーライドすることです。

func responseObject(応答の場合:URLResponse ?、データ:データ?、エラー:NSErrorPointer)->任意?

そこで、応答を解析し、必要なタイプにキャストして返すことができます。

0