Objective C SOAP Request with Java Web Service

I have a simple Web service in Java:

@WebService(serviceName = "Catalogo_V1")
public class Catalogo_V1 {

        /** This is a sample web service operation */
        @WebMethod(operationName = "hello")
        public String hello(@WebParam(name = "name") String txt) 
        {
            System.out.println("kkk"+txt);
            if(txt != null)
            {
                txt= txt +"www";
            }

            return "Hello " + txt + " !";
        }

    }

I have done a Test in this web service: (http://localhost:8080/WSServer/Catalogo_V1?Tester)

  • How do I call a webservice in Swift?
  • IOS 9 NSURLConnection deprecated
  • Sending Parameters to the SOAP ASMX Service from iOS Application
  • Consuming SOAP web services on iOS
  • Best architectural approaches for building iOS networking applications (REST clients)
  • Converting byte array coming from Web service to UIImage iPhone
  • Method returned

    java.lang.String : "Hello davidwww !"
    
    SOAP Request
    
    <?xml version="1.0" encoding="UTF-8"?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Header/>
        <S:Body>
            <ns2:hello xmlns:ns2="http://org/">
                <name>david</name>
            </ns2:hello>
        </S:Body>
    </S:Envelope>
    

    SOAP Response

    <?xml version="1.0" encoding="UTF-8"?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Body>
            <ns2:helloResponse xmlns:ns2="http://org/">
                <return>Hello davidwww !</return>
            </ns2:helloResponse>
        </S:Body>
    </S:Envelope>
    

    Ok, after that i have done this request in Objective C:

    ConfigViewController.h

    @interface ConfigViewController : UITableViewController 
    {
    NSMutableData *webData;
        NSXMLParser *xmlParser;
        NSString *finaldata;
        NSString *convertToStringData;
        NSMutableString *nodeContent;
    
    }
    -(IBAction) buttonPressed: (id) sender;
    
    
    @end
    

    ConfigViewController.m

    #import "ConfigViewController.h"
    
    @implementation ConfigViewController
    
    ...
    
    - (IBAction)buttonPressed:(id)sender 
    {
    
    nodeContent = [[NSMutableString alloc]init];
    
        NSString *soapFormat = [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:Body>\n"
                                "<ns2:hello xmlns:ns2=\"http://org/\" />\n"
                                "<name>david</name>\n"
                                "</ns2:hello>\n"
                                "</soap:Body>\n"
                                "</soap:Envelope>\n"];
    
    
    
        NSLog(@"The request format is: \n%@",soapFormat);
    
        NSURL *locationOfWebService = [NSURL URLWithString:@"http://localhost:8080/WSServer/Catalogo_V1?wsdl"];
    
        NSLog(@"web url = %@",locationOfWebService);
    
        NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc]initWithURL:locationOfWebService];
    
        NSString *msgLength = [NSString stringWithFormat:@"%d",[soapFormat length]];
    
    
        [theRequest addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
        [theRequest addValue:@"http://localhost:8080/WSServer/Catalogo_V1?wsdl" forHTTPHeaderField:@"SOAPAction"];
        [theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"];
        [theRequest setHTTPMethod:@"POST"];
        //the below encoding is used to send data over the net
        [theRequest setHTTPBody:[soapFormat dataUsingEncoding:NSUTF8StringEncoding]];
    
    
        NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:theRequest delegate:self];
    
        if (connect) {
            webData = [[NSMutableData alloc]init];
        }
        else {
            NSLog(@"No Connection established");
        }
    }
    
    -(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];
    }
    
    -(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
    {
        return YES;
    }
    
    -(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
    {
        NSURLCredential *credential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession];
        [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
    }
    
    
    -(void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        NSLog(@"DONE. Received Bytes: %d \n", [webData length]);
        NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
        NSLog(@"\n%@",theXML);
     [connection release];
    }
    
    ...
    
    @end
    

    My console show:

        2011-09-02 10:17:32.748 Catalogo-V1[1131:207] The request format is: 
        <?xml version="1.0" encoding="utf-8"?>
        <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/">
        <soap:Body>
        <ns2:hello xmlns:ns2="http://org/" />
        <name>david</name>
        </ns2:hello>
        </soap:Body>
        </soap:Envelope>
        2011-09-02 10:17:32.749 Catalogo-V1[1131:207] web url = http://localhost:8080/WSServer/Catalogo_V1?wsdl
        2011-09-02 10:17:32.757 Catalogo-V1[1131:207] DONE. Received Bytes: 224 
        2011-09-02 10:17:32.757 Catalogo-V1[1131:207] 
        <?xml version='1.0' encoding='UTF-8'?>
        <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">        
    <S:Body> 
    <ns2:helloResponse xmlns:ns2="http://org/">
    <return>Hello null !</return>
    </ns2:helloResponse>
    </S:Body>
    </S:Envelope>
    

    Solutions Collect From Internet About “Objective C SOAP Request with Java Web Service”

    According to what you’ve shown from your console, the XML request you formulated is invalid. You have

    <ns2:hello xmlns:ns2="http://org/" />
        <name>david</name>
    </ns2:hello>
    

    But you should have (note the removal of the invalid XML tag termination):

    <ns2:hello xmlns:ns2="http://org/>
        <name>david</name>
    </ns2:hello>
    

    Also note that your working sample request includes a soap:Header element, and yours does not. That is unlikely to be the problem here though.