Ios

NSCocoaErrorDomain Code = 3840 '操作を完了できませんでした。 (ココアエラー3840。) '



Nscocoaerrordomain Code 3840the Operation Couldn T Be Completed

元の:

http://stackoverflow.com/questions/19874935/afnetworking-2-0-post-issue-cocoa-error-3840json-text-did-not-start-with-array



尋ねる:

ローカルサーバーで(MAMPを使用して)api.phpを呼び出そうとしています。サーバー側のapi.phpが呼び出されていますが、phpコード内の_POSTのコンテンツに次のエラーが含まれています。



エラードメイン= NSCocoaErrorDomainコード= 3840 '操作を完了できませんでした。 (Cocoaエラー3840。) '(JSONテキストが配列またはオブジェクトで開始されておらず、フラグメントを設定できないようにするオプション。)UserInfo = 0x15d7bdd0 {NSDebugDescription = JSONテキストが配列またはオブジェクトで開始されておらず、フラグメントを設定できないようにするオプション。}

JSON POSTリクエストをapi.phpに送信しようとしている私のアプリは、AFNetworking2を使用するiOSアプリです。

これは私のリクエストコードです:



- (void)postUpdateRequest { if (!dataModel) dataModel = [[DataModel alloc] init] NSDictionary *params = @{@'foo': @'bar2'} NSLog(@'%@',params) /* NSDictionary *params = @{@'cmd':@'update', @'user_id':[dataModel userId], @'token':[dataModel deviceToken] }//@'ip_address':[dataModel getIPAddress]}*/ AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager] // manager.requestSerializer = [AFJSONRequestSerializer serializer] [manager POST:ServerApiURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@'JSON: %@', responseObject) } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@'Error: %@', error) }] }

私はインターネット全体を見ましたが、私の特定の問題に対する答えを見つけることができません。何をしても同じエラーが返されます。

JSONが正しくフォーマットされていないのはなぜですか?また、実際に送信しているJSONをスニッフィングする方法が見つからないようです。

ありがとうございました。

回答:

例のようにAPIを使用する場合、HTTPメッセージはContent-Type application/x-www-form-urlencodedを使用して作成されます。内部的には、あなたのparam辞書はAFNによってエンコードされ(w3cで指定されているように厳密には正しくありませんが)、要求の本文として設定されます。

以来、あなたはAcceptを指定しませんでしたヘッダーの場合、サーバーは可能な応答データ(存在する場合)のコンテンツタイプを自由に選択できます。

応答を受け取ったら、次のことを行う必要があります 常に HTTPステータスコードと応答本文のコンテンツタイプ(存在する場合)を確認します。

サーバーが、問題を示すステータスコードと、予想とは異なる種類のコンテンツタイプの「エラー応答」を含む応答本文を返した可能性があります(たとえば、text / htmlを返しました)。

中国の解決策について:

AFNetworkingフレーム分析データエラープロンプトを使用する

データ要求が失敗しました

エラードメイン= NSCocoaErrorDomainコード= 3840 '操作を完了できませんでした。 (Cocoaエラー3840。) '(JSONテキストが配列またはオブジェクトで開始されておらず、フラグメントを設定できないようにするオプション。)UserInfo = 0x9b7eba0 {NSDebugDescription = JSONテキストが配列またはオブジェクトで開始されておらず、フラグメントを設定できないようにするオプション。}

解決する:

JSON解析ライブラリのAFNetWorkingはAFJSONRequestOperationのデフォルトモードが使用され、text / json、application / json、text / javascriptのみをサポートするため、code = -1016エラーが発生した場合、現在のJSON解析モードはtext / htmlであるため、次のコードを追加します。

[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@ 'text / html']] //この文を追加します

NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@ '%@'、kDMBaseURL]]

NSURLRequest * request = [NSURLRequest requestWithURL:url]

[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@ 'text / html']] //この文を追加します

AFJSONRequestOperation * jsonOperation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest * request、NSHTTPURLResponse * response、id JSON){

DMLog(@ 'str%@'、JSON)

}失敗:^(NSURLRequest * request、NSHTTPURLResponse * response、NSError * error、id JSON){

DMLog(@ 'データ要求に失敗しました%@'、エラー)

}]

[jsonOperation開始]

彼にテキスト/ htmlモードをサポートさせて解決することができます

データ要求が失敗しました

エラードメイン= NSCocoaErrorDomainコード= 3840 '操作を完了できませんでした。 (Cocoaエラー3840。) '(JSONテキストが配列またはオブジェクトで開始されておらず、フラグメントを設定できないようにするオプション。)UserInfo = 0x9ba1b30 {NSDebugDescription = JSONテキストが配列またはオブジェクトで開始されておらず、フラグメントを設定できないようにするオプション。}

解決する:

スロー時にエラーを変換したときにライブラリ内に返される有効なJSON文字列ではありません

つまり、最後の文は確かにサーバー側にあり、指定された出力JSONデータの前に追加データの出力をカットします。エラー。サーバーは判断セクションに行くことができます。