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データの前に追加データの出力をカットします。エラー。サーバーは判断セクションに行くことができます。