0

これらのパラメーターを使用して Web サービスを呼び出そうとしています。

{"Class":"Authorization","method":"login","user":"","pass":""}

次のように

NSString *user = [NSString stringWithFormat:@"username=%@",_username.text];
NSString *pass = [NSString stringWithFormat:@"password=%@",_password.text];
NSString *Class = @"Authorization";
NSString *method = @"login";

//NSString *post = [NSString stringWithFormat:@"%@&%@&%@&%@", user, pass, Class, method ];
    
NSString *jsonPostBody = [NSString stringWithFormat:@"'json' = '{\"Class\":"
                              "\"%@\""
                              ",\"method\":"
                              "\"%@\""
                              ",\"pass\":"
                              "\"%@\""
                              ",\"user\":"
                              "\"%@\""
                              "}'",
                              [Class stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                              [method stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                              [pass stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                              [user stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSData *postData = [jsonPostBody dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
   
    NSURL *url = [NSURL URLWithString:@"http://212.119.87.45:8080/IktissabServices/index.php/service"];
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                       timeoutInterval:180.0];
    
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/x-www-form-urlencoded"   forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:[[jsonPostBody stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]
                          dataUsingEncoding:NSUTF8StringEncoding
                          allowLossyConversion:YES]];
    
    [request setHTTPBody:postData];
    
    NSString* postDataLengthString = [[NSString alloc] initWithFormat:@"%d", [postData length]];
    [request setValue:postDataLengthString forHTTPHeaderField:@"Content-Length"];
    
    NSURLResponse *response;
    NSError *err;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    NSError *error;
    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];//
    if (! error) {
        NSLog(@"%@",jsonDict);
    }else{
        NSLog(@"%@",error.localizedDescription);
    } 

毎回結果は次のとおりです。

キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'data parameter is nil'

Web サービスには次のものがあります。

入力コンテンツタイプ: text/json

出力コンテンツタイプ: text/json

ヘルプや例をいただければ幸いです。

4

1 に答える 1

0

次のコードでは例外は発生しません (ただし、明らかにサーバーにアクセスできないため、エンドツーエンドでテストすることはできません)。

NSDictionary *dictionary = @{
    @"Class"  : @"Authorization",
    @"method" : @"login",
    @"pass"   : _password.text,
    @"user"   : _username.text
};

NSError *error;
NSData *postData = [NSJSONSerialization dataWithJSONObject:dictionary
                                                   options:0
                                                     error:&error];
if (error)
    NSLog(@"Failure to serialize JSON object %@", error);

NSURL *url = [NSURL URLWithString:@"http://212.119.87.45:8080/IktissabServices/index.php/service"];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval:180.0];

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

NSURLResponse *response;

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error)
    NSLog(@"%s sendSynchronousRequest error %@", __FUNCTION__, error);

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];//
if (!error) {
    NSLog(@"%@",jsonDict);
} else {
    NSLog(@"%s JSONObjectWithData error %@", __FUNCTION__, error);
} 

または、最新の Xcode を使用しておらず、ディクショナリの最新の Objective C 定義にアクセスできない場合は、明らかに従来の方法でディクショナリを定義できます。

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                            @"Authorization", @"Class",
                            @"login",         @"method",
                            _password.text,   @"pass",
                            _username.text,   @"user",
                            nil];

編集:

から推測するjsonPostBodyと、辞書のエントリは次のようにする必要がある場合があります。

NSDictionary *dictionary = @{
    @"json" : @{
        @"Class"  : @"Authorization",
        @"method" : @"login",
        @"pass"   : _password.text,
        @"user"   : _username.text
    }
};

またはおそらく(可能性は低いですが)、userand のpass定義から推測します。

NSDictionary *dictionary = @{
    @"json" : @{
        @"Class"  : @"Authorization",
        @"method" : @"login",
        @"pass"   : [NSString stringWithFormat:@"password=%@",_password.text],
        @"user"   : [NSString stringWithFormat:@"username=%@",_username.text]
    }
};

これは、JSON をサーバー用にどのようにフォーマットする必要があるかという問題です。

于 2012-11-14T14:52:26.680 に答える