Как разобрать .Net Webservice на iphone с аутентификацией - PullRequest
0 голосов
/ 21 июля 2011

Я пытаюсь получить xml, используя NSMutableRequest и соединение NSURL, но я получаю 0 байт, но когда я передал? WSDL в ссылке, чтобы в ответ получить схему, но я хочу получить xml, а затем проанализирую с помощью TouchXML.Мой код ниже.

    NSString *username = @"username";
    NSString *password = @"pasword";
    NSString *soapMessage = [NSString stringWithFormat:
                             @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                             "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
                             "<soap:Header>\n"
                             "<RequestAuthenticator xmlns=\"http://tempuri.org/\">\n"
                             "<Password>%@</Password>\n"
                             "<UserName>%@</UserName>\n"
                             "</RequestAuthenticator>\n"
                             "</soap:Header>\n"
                             "<soap:Body>\n"
                             "<METHODNAME xmlns=\"http://tempuri.org/\"/>\n"
                             "</soap:Body>\n</soap:Envelope>\n",password,username];
    NSLog(@"%@",soapMessage);

     NSURL *url = [NSURL URLWithString:@"http://websitename.com/website_english/wservice/website_service.asmx"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    /*ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setUseKeychainPersistence:YES];
    [request setUsername:@"username"];
    [request setPassword:@"password"];
    [request setDelegate:self];
    [request startAsynchronous];*/
    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

    [request addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request addValue: @"http://tempuri.org/METHODNAME" forHTTPHeaderField:@"SOAPAction"];
    [request addValue: msgLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    if( theConnection )
    {
        webData = [[NSMutableData data] retain];
    }
    else
    {
        NSLog(@"theConnection is NULL");
    }

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [webData setLength: 0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [webData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"ERROR with theConenction");
    [connection release];
    [webData release];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    NSLog(@"%@",theXML);
    [theXML release];
}

Но он возвращает мне 0 байт и не содержит xml, оригинальное имя веб-сайта не раскрывается для безопасности.

Я также пробовал пример кода HelloSOAP.xcodeproj, но яне могу пройти через это.

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Если ваша проблема связана с аутентификацией, взгляните на мой вопрос и ответ на него, так как мне пришлось с ним там разобраться: Примеры разбора ответов SOAP и XML для iPhone / iPad?

Кроме этого, не зная больше о том, что ожидает служба и что вы передаете, я не знаю, какую помощь вы сможете получить. Как и сейчас, я не вижу ничего плохого в том коде, который у вас есть.

EDIT:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    NSURLCredential *myCreds = [[NSURLCredential alloc] initWithUser:@"**USERNAME**" password:@"**PASSWORD**" persistence:NO];

    [challenge.sender useCredential:myCreds forAuthenticationChallenge:challenge];
    [myCreds release];
}

Я отредактировал код из своего ответа на связанный вопрос для облегчения доступа.

Кроме того, я перечитываю ваш код, на самом деле ваше имя пользователя и пароль, "username" и "password"? Если это так, и вы копируете и вставляете приведенный выше код, когда вы устанавливаете переменный пароль в верхней части, вы неправильно написали "пароль".

-Karoly

0 голосов
/ 21 июля 2011

Если для веб-службы требуется аутентификация, вам необходимо ее предоставить.

Вы не устанавливаете в запросе аутентификацию, поэтому она не будет отправлять.

В зависимости отвеб-сервис, аутентификация может быть такой простой, как basic, и это только код пользователя и код base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...