0

私は2つのコードを書きました両方とも同じです

  1. NSURLConnectionを使用して
  2. AFNetworkingを使用します。

私のNSURLConnectionコードは正常に機能しますが、AFNetworkingコードは機能しません。問題は、コードからJSON応答を取得しているのに、コードから応答をNSURLConnection取得していないのに、応答コードを200として取得していることです。私はすべての可能な組み合わせを試しましたが、それでも運がありません。何が問題なのかわかりません。今後も使いたいので、誰か助けてください。ありがとう、-アミットJSONAFNetworkingAFNetworking

NSURLConnection:

- (IBAction)connectHandler:(UIButton *)sender {

//This is where we attempt to connect to the URL represented by self.labelHostURL
//along with exception handling
NSString *request_type = @"STARTUP";    
NSString *request_data = @"{\"lstCacheRefDt\":\"10/10/2010\",\"langCd\":\"en_US\",\"timeZn\":\"America/Chicago\",\"brndId\":\"WM\",\"prgmId\":\"WM0012\"}";
NSLog(@"Request: %@", request_data);

NSURL *url = [NSURL URLWithString:[ self.labelHostURL text ]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
//NSData *requestData = [NSData dataWithBytes:[request_data UTF8String] length:[jsonRequest length]];

[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

NSString* request_body = [NSString
                          stringWithFormat:@"request_type=%@&request_data=%@",
                          [request_type stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                          [request_data stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:[request_body dataUsingEncoding:NSUTF8StringEncoding]];

[NSURLConnection connectionWithRequest:request delegate:self];    }

AFNetworking:

- (void) getHomeData {

NSURL *url = [[NSURL alloc] initWithString:@"https://localhost:8443/MNMMLMockService/mAccountsWeb/services/mnapp/rpc"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

NSDictionary *homePostParams1 = [NSDictionary dictionaryWithObjectsAndKeys:
                                @"10/10/2010", @"lstCacheRefDt",
                                @"en_US", @"langCd",
                                @"America/Chicago", @"timeZn",
                                @"WM", @"brndId",
                                @"WM0012", @"prgmId", nil];

NSDictionary *homePostParams = [NSDictionary dictionaryWithObjectsAndKeys:@"STARTUP", @"request_type", homePostParams1,@"request_data", nil];

NSLog(@"Dic: %@", homePostParams);

NSMutableURLRequest *homeRequest = [httpClient requestWithMethod:@"POST" path:@"" parameters:homePostParams];
[homeRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[homeRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:homeRequest
                                     success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                                         NSLog(@"JSON %@", JSON);
                                         NSLog(@"operation StatusCode: %d", [response statusCode]);
                                     } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                                         NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
                                     }];
[operation start]; }
4

2 に答える 2

2

JSONではなくURLフォームでエンコードされたデータをサーバーに送信する理由がわかりませんが、JSONが返されることを期待しています。ヘッダーフィールドを設定しないでください。これを削除します:

[homeRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[homeRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

それを設定したい場合は(そうする必要はありませんが)、を使用して設定しますAFHTTPClient。例えば:

[httpClient setParameterEncoding:AFJSONParameterEncoding];

AFNetworkingさらに、 JSONをエンコード/デコードすることをご存知ですか?オブジェクトを渡すと、JSONとして自動的にエンコードされ、同様に、受信したJSONを自動的に取得して、Objective-cオブジェクトにデコードされます。したがって、AFNetworkingライブラリからプレーンJSONを受け取ることはなく、対応するオブジェクトを受け取ります。

編集

私はあなたの問題を今見ています。AFNetworkingパラメータの半分をURLフォームでエンコードすることを期待していますが、残りの部分もJSONでエンコードしています。を使用AFNetworkingすると、パラメータオブジェクト全体を1つまたは他のものとしてエンコードする必要があります。作成したhomePostParamsを保持してJSONでエンコードし、すべてのJSONを期待するようにサーバーを書き換えて、100%JSONに変更することをお勧めします。

AFNetworkingそのように分割する必要がある場合は、エンコード/デコードを行うことに頼ることはできません。あなたはあなたがしたことをしなければなりませんNSURLConnection

NSString *request_data = @"{\"lstCacheRefDt\":\"10/10/2010\",\"langCd\":\"en_US\",\"timeZn\":\"America/Chicago\",\"brndId\":\"WM\",\"prgmId\":\"WM0012\"}";
NSDictionary *homePostParams = [NSDictionary dictionaryWithObjectsAndKeys:@"STARTUP", @"request_type", request_data,@"request_data", nil];

しかし、一種の目的を打ち負かしAFNetworkingます。サーバーがURLフォームエンコーディングではなくJSONを受信することを期待している場合は、はるかに優れています

于 2012-06-21T19:24:43.593 に答える
2

私はAFNetworkingライブラリを使用していますが、あなたは私が行ういくつかのステップを見逃しているようです。私は通常AFHTTPClientをサブクラス化します。サブクラス化するかどうかに関係なく、必ずAFHTTPClientのregisterHTTPOperationClassメソッドを呼び出してください。

たとえば、initプロセス中のAFHTTPClientサブクラスでは、次のようになります(selfはAFHTTPClientインスタンスです)。

[self registerHTTPOperationClass:[AFJSONRequestOperation class]];

これにより、適切な受け入れヘッダーが設定されます。

操作(すべてjson応答を期待)の場合、私は次のようなことをします:

AFHTTPRequestOperation *httpOperation = [httpClient HTTPRequestOperationWithRequest:request 
    success:^(AFHTTPRequestOperation *operation, id responseJSONObject) { // some logic}
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { // some logic }];
于 2012-06-21T20:59:12.023 に答える