SOAP на iOS не работает - PullRequest
       2

SOAP на iOS не работает

0 голосов
/ 15 февраля 2012

Я очень новичок в SOAP, так что не бери в голову мою глупость.У меня есть веб-служба SOAP, расположенная по адресу http://207.7.208.250:31361/SSI_MOBILE_PROD_INQ

WSDL выглядит следующим образом

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 

xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:intf="HTTP://207.7.208.250" targetNamespace="HTTP://207.7.208.250">
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:intf="HTTP://207.7.208.250" elementFormDefault="qualified" targetNamespace="HTTP://207.7.208.250">
<element name="ProductInquiryResponse">
<complexType>
<sequence>
<element name="EclipsePN" type="string"/>
<element name="Description" type="string"/>
<element name="AlternateDescription" type="string"/>
<element name="UPC" type="string"/>
<element name="Catalog" type="string"/>
<element name="PartNumber" type="string"/>
<element name="AvailQty" type="string"/>
<element name="AvailDate" type="string"/>
<element name="AvailUOM" type="string"/>
<element name="Price" type="string"/>
<element name="PriceUOM" type="string"/>
<element name="ImageURL" type="string"/>
<element name="SpecSheetURL" type="string"/>
<element name="ErrorDescription" type="string"/>
</sequence>
</complexType>
</element>
<element name="ProductInquiry">
<complexType>
<sequence>
<element name="Login" type="string"/>
<element name="Password" type="string"/>
<element name="EclipsePN" type="string"/>
<element name="UPC" type="string"/>
<element name="HomeBranch" type="string"/>
</sequence>
</complexType>
</element>
<element name="CALL_SSI_MOBILE_PROD_INQ">
<complexType>
<sequence>
<element ref="intf:ProductInquiry"/>
</sequence>
</complexType>
</element>
<element name="CALL_SSI_MOBILE_PROD_INQResponse">
<complexType>
<sequence>
<element ref="intf:ProductInquiryResponse"/>
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>
<wsdl:message name="CALL_SSI_MOBILE_PROD_INQResponse">
<wsdl:part name="parameters" element="intf:CALL_SSI_MOBILE_PROD_INQResponse"></wsdl:part>
</wsdl:message>
<wsdl:message name="CALL_SSI_MOBILE_PROD_INQRequest">
<wsdl:part name="parameters" element="intf:CALL_SSI_MOBILE_PROD_INQ"></wsdl:part>
</wsdl:message>
<wsdl:portType name="SSI_MOBILE_PROD_INQ">
<wsdl:operation name="CALL_SSI_MOBILE_PROD_INQ">
<wsdl:input name="CALL_SSI_MOBILE_PROD_INQRequest" message="intf:CALL_SSI_MOBILE_PROD_INQRequest"></wsdl:input>
<wsdl:output name="CALL_SSI_MOBILE_PROD_INQResponse" message="intf:CALL_SSI_MOBILE_PROD_INQResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SSI_MOBILE_PROD_INQSOAPBinding" type="intf:SSI_MOBILE_PROD_INQ">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="CALL_SSI_MOBILE_PROD_INQ">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="CALL_SSI_MOBILE_PROD_INQRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="CALL_SSI_MOBILE_PROD_INQResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SSI_MOBILE_PROD_INQ">
<wsdl:port name="SSI_MOBILE_PROD_INQ" binding="intf:SSI_MOBILE_PROD_INQSOAPBinding">
<wsdlsoap:address location="HTTP://207.7.208.250:31361/SSI_MOBILE_PROD_INQ"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

Это то, что я делаю для получения ... Я хочу отправить в UPCзакодируйте и извлеките полученный xml, который я затем проанализирую и получу данные.

NSMutableString *sRequest = [[NSMutableString alloc] init];
        [sRequest appendString:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
        [sRequest appendString:@"<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/\">"];
    [sRequest appendString:@"<soap:Body>"];
    [sRequest appendString:@"<SSI_MOBILE_PROD_INQ xmlns=\"http://207.7.208.250:31361/SSI_MOBILE_PROD_INQ/\">"];
    [sRequest appendString:@"<CALL_SSI_MOBILE_PROD_INQ>"];
    [sRequest appendString:@"<UPC>"];
    [sRequest appendString:@"78285630648"];
    [sRequest appendString:@"</UPC>"];
    [sRequest appendString:@"</CALL_SSI_MOBILE_PROD_INQ>"];
    [sRequest appendString:@"</SSI_MOBILE_PROD_INQ>"];
    [sRequest appendString:@"</soap:Body>"];
    [sRequest appendString:@"</soap:Envelope>"];

    NSURL *weatherServiceURL = [NSURL URLWithString:@"http://207.7.208.250:31361/SSI_MOBILE_PROD_INQ"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:weatherServiceURL];

    [request addValue:@"text/xml; charset:UTF-8" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"http://207.7.208.250:31361/SSI_MOBILE_PROD_INQ" forHTTPHeaderField:@"SOAPAction"]; 

    [request setHTTPMethod:@"POST"];

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

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

    if (conn) {
        myMutableData = [NSMutableData data];
        NSLog(@"Conn is true");
    }
    [NSURLConnection connectionWithRequest:request delegate:self];

    NSError *WSerror;
    NSURLResponse *WSresponse;

    NSData *returnData = (NSMutableData*)[NSURLConnection sendSynchronousRequest:request
                                          returningResponse:&WSresponse error:&WSerror];
if(WSerror){
     NSLog(@"%@", [WSerror localizedDescription]);
 }
if (returnData) {

    NSString *content = [NSString stringWithUTF8String:[myMutableData bytes]];
    DebugLog(@"yeah %@", content);
}

Я не получаю вывод из строки содержимого.Я думаю, что я не вызываю метод SOAP правильно ....?Что ты думаешь?

1 Ответ

0 голосов
/ 15 февраля 2012

Я вижу некоторые проблемы с вашим кодом:

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[NSURLConnection connectionWithRequest:request delegate:self];
NSData *returnData = (NSMutableData*)[NSURLConnection sendSynchronousRequest:request
                                          returningResponse:&WSresponse error:&WSerror];

connectionWithRequest: делегат: Создает и возвращает инициализированное URL-соединение и начинает загружать данные для URL-запроса.

initWithRequest: делегат: Возвращает инициализированное соединение URL и начинает загружать данные для запроса URL.

sendSynchronousRequest: returningResponse: ошибка: Выполняет синхронную загрузку указанного URL-запроса.

См .: Ссылка класса NSURLConnection

Почему вы делаете все три в одном методе? Два асинхронных URL-соединения и одно синхронное соединение.

sendSynchronousRequest настоятельно не рекомендуется использовать в основном потоке.

Вам нужен только один объект соединения URL для отправки асинхронной загрузки запроса URL. Прокомментируйте отдых после:

if (conn) {
        myMutableData = [NSMutableData data];
        NSLog(@"Conn is true");
    } 

Изменить myMutableData = [NSMutableData data]; to myMutableData = [[NSMutableData alloc] init];

и реализовать NSURLConnectionDelegate методы для получения асинхронных обратных вызовов:

-(NSCachedURLResponse *)connection:(NSURLConnection *)connection
                 willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
  return nil;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
   NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
   NSInteger statusCode = [httpResponse statusCode];
   NSLog(@"Http Status Code: %i",statusCode);
   if ([response respondsToSelector:@selector(statusCode)])
{
  int statusCode = [((NSHTTPURLResponse *)response) statusCode];
  if (statusCode >= 400)
  {
    [connection cancel];  // stop connecting; no more delegate messages
    NSDictionary *errorInfo
      = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:
          NSLocalizedString(@"Server returned status code %d",@""),
            statusCode]
                                    forKey:NSLocalizedDescriptionKey];
    NSError *statusError
      = [NSError errorWithDomain:@"HTTP Error"
                            code:statusCode
                        userInfo:errorInfo];
    [self connection:connection didFailWithError:statusError];
  }
}
   [myMutableData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
   [myMutableData appendData:data];
}

- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error
{
   NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
   connection = nil;
   [myMutableData release],myMutableData = nil;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
   NSString *result =[[NSString alloc]initWithData:myMutableData encoding:NSUTF8StringEncoding];   
   NSLog(@"downloaded output  %@",result);

   [result release];
   [myMutableData release],myMutableData = nil;     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...