how to create soap message - iphone

I am doing with soap request/response app. I have login page.That have user id and password. This is my soap message.
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:Body>\n"
"<SignOn xmlns=\"http://10.12.50.99/CUTechWebservices/CuTechWebService.asmx\">\n"
"<DeviceID>4A6B740C-0B5B-5F8C-8694-1EC0196C1C67</DeviceID>\n"
"<UserID>string</UserID>\n"
"<CrID>6</CrID>\n"
"<UserPin>string</UserPin>\n"
"</SignOn>\n"
"</soap:Body>\n"
"</soap:Envelope>\n"];
As user id and password are diff for users, I want to pass the values from the textfields (user id and password) to the soap message.
How to do this?
Thanks in advance.

OK So below is some steps to follow. I am not sure exact code you can use or not. But modify it as per your need.
For Calling Request Do something like this :
NSMutableURLRequest *request = [WebAPIRequest buildSOAPRequest:#"WebserviceURL" withPostData:strRequest WebMethod:#"YourWebMethodHereForExample-ValidateUSer"];
Connection *con = [[[Connection alloc]initWithClass:#"getClientResult" withRoot:#"soap:Body" withDelegate:delegate withTag:tag]autorelease];
[[[NSURLConnection alloc]initWithRequest:request delegate:con] autorelease];
BuildDataRequest should be like this.
+(NSMutableURLRequest *)buildSOAPRequest:(NSString *)serviceUrl withPostData:(NSString *)dataString WebMethod:(NSString*)strMethod{
NSURL *url = [NSURL URLWithString:serviceUrl];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%d", [dataString length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
if (isRegion==YES)
{
isRegion = NO;
[theRequest addValue:[NSString stringWithFormat:#"%#%#",NSLocalizedString(#"SOAP Action1",nil),strMethod] forHTTPHeaderField:#"SOAPAction"];
}else
{
[theRequest addValue:[NSString stringWithFormat:#"%#%#",NSLocalizedString(#"SOAP Action",nil),strMethod] forHTTPHeaderField:#"SOAPAction"];
}
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [dataString dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(#"%#",dataString);
return theRequest;
}
Hope this help.

Related

Working with Web services in iPhone

I'm using SOAP in an iPhone app, and I got this error:
<faultcode>soap:Client</faultcode><faultstring>Server did not recognize the value of HTTP Header SOAPAction: http://tempuri.org/CelsiusToFahrenheit.</faultstring><detail /></soap:Fault></soap:Body></soap:Envelope>
This is my code:
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"
"<CelsiusToFahrenheit xmlns=\"http://tempuri.org/\">\n"
"<Celsius>%#</Celsius>\n"
"</CelsiusToFahrenheit>\n"
"</soap:Body>\n"
"</soap:Envelope>\n",txt1.text];
NSURL *locationOfWebService = [NSURL URLWithString:#"http://www.w3schools.com/webservices/tempconvert.asmx"];
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://tempuri.org/CelsiusToFahrenheit" 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]];
Any help will be appreciated, thanks.
just went through the url http://www.w3schools.com/webservices/tempconvert.asmx for location of web service, there i found that in while using SOAP 1.1 soap action was http://www.w3schools.com/webservices/CelsiusToFahrenheit
and not http://tempuri.org/CelsiusToFahrenheit as you have written for your soacp action field.
This is the exact format for sending request to this particular web service ,
POST /webservices/tempconvert.asmx HTTP/1.1
Host: www.w3schools.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.w3schools.com/webservices/CelsiusToFahrenheit"
I believe you are setting wrong value of soap action. because soap action mentioned is different from what you have written. (FYI, soap action is used to identify one particular web service or web method, from a large no of web methods , which are present on same location)
Try this.It will work
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"
"<CelsiusToFahrenheit xmlns=\"http://www.w3schools.com/webservices/\">\n"
"<Celsius>%#</Celsius>\n"
"</CelsiusToFahrenheit>\n"
"</soap:Body>\n"
"</soap:Envelope>\n",#"30"];
NSURL *locationOfWebService = [NSURL URLWithString:#"http://www.w3schools.com/webservices/tempconvert.asmx"];
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://www.w3schools.com/webservices/CelsiusToFahrenheit" 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]];
//Try This One It Returns integer value
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"
"<CelsiusToFahrenheit xmlns=\"http://www.w3schools.com/webservices/\">\n"
"<Celsius>%#</Celsius>\n"
"</CelsiusToFahrenheit>\n"
"</soap:Body>\n"
"</soap:Envelope>\n",#"50"];
NSURL *locationOfWebService = [NSURL URLWithString:#"http://www.w3schools.com/webservices/tempconvert.asmx"];
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://www.w3schools.com/webservices/CelsiusToFahrenheit" 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]];
NSURLResponse *response;
NSData *data_reply;
NSError *err;
data_reply = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&err];
NSString *aStr = [[NSString alloc] initWithData:data_reply encoding:NSASCIIStringEncoding];
NSLog(#"aStr:%#",aStr);
O/P:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><CelsiusToFahrenheitResponse xmlns="http://www.w3schools.com/webservices/"><CelsiusToFahrenheitResult>122</CelsiusToFahrenheitResult></CelsiusToFahrenheitResponse></soap:Body></soap:Envelope>
check this answer it returns 122 integer value.......

"Root element is missing" Soap Request in iOS

I have SOAP webservice and I tried connect it. But SOAP response contains that "System.Xml.XmlException: Root element is missing."
My obj-c code. What's wrong?
NSString *soapMessage = [NSString stringWithFormat:
#"<?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>"
"<Method1 xmlns=\"http://tempuri.org/\">"
"<param1>string</param1>"
"</Method1>"
"</soap:Body>"
"</soap:Envelope>"];
NSLog(soapMessage);
NSURL *url = [NSURL URLWithString:#"web service url"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapMessage length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest addValue: #"\"http://tempuri.org/Method1\"" forHTTPHeaderField:#"SOAPAction"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if( theConnection )
{
webData = [[NSMutableData data] retain];
}
else
{
NSLog(#"theConnection is NULL");
}
NSString *soapMessage = [NSString stringWithFormat:
#"<?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>"
"<Method1 xmlns=\"http://tempuri.org/\">"
"<param1>%#</param1>"
"</Method1>"
"</soap:Body>"
"</soap:Envelope>",str];
Str here is a string that you need to pass for param1.
Hope This will work for you.
you need to remove the extra quotations from:
[theRequest addValue: #"\"http://tempuri.org/Method1\"" forHTTPHeaderField:#"SOAPAction"];
it should read:
[theRequest addValue: #"http://tempuri.org/Method1" forHTTPHeaderField:#"SOAPAction"];
hope that helps.

How to upload image + xml into web server using SOAP request from iphone application

I am implementing an iPad application. In my application I need to get some information and profile pic from user and need to upload that information to a web server using SOAP request. I am done with text inputs uploading. But when it comes to image I am not aware of that. I know, to upload an image we need to convert that to NSData I did it, but how can I add that to my post string?
My code is as follows:
NSData* imageData = UIImagePNGRepresentation(myPic);
NSString* uploadValues=#"";
uploadValues = [uploadValues stringByAppendingString:[NSString stringWithFormat:#"<UserInformation><UserInfo action=\"INSERT\"><Userid>123</Userid><FirstName>abc</FirstName><LastName>xyz</LastName><Contact>00000000</Contact><Email>abc#googole.com</Email><Address>USA</Address><Image>How can I put image data here? is that work if I put data here?</Image></UserInfo></UserInformation>"];
uploadValues = [uploadValues stringByReplacingOccurrencesOfString:#"(null)" withString:#" "];
serverConnections=[ServerConnections sharedConnections];
serverConnections.delegate=self;
NSString* soapString = [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"
"<SetUserInfo xmlns=\"http://example.com/\">\n"
"<Data><![CDATA[ %s ]]></Data> \n"
"</SetUserInfo> \n"
"</soap:Body>\n"
"</soap:Envelope>\n",[uploadValues UTF8String]];
printf("\n Input string:%s",[soapString UTF8String]);
NSURL *url = [NSURL URLWithString:#"http://example.com/xyz.asmx"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapString length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue: #"http:/example.com/SetUserInfo" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [soapString dataUsingEncoding:NSUTF8StringEncoding]];
[serverConnections startEstablishingConnectionwithServer:theRequest];
From Here
[req addValue:#"image/jpeg" forHTTPHeaderField:#"Content-Type"];
[req setHTTPBody:imgData]

pass multiple value to webservice in iphone

I want to access a webservice, want to pass 2 parameters.
When I run the code below, this error is shown:
#countryname not supplied
I already pass 2 parameters as txtcity and txtcountry.
-(IBAction)FindWords:(id)sender
{
NSString *soapMsg =
[NSString stringWithFormat:
#"<?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>"
"<GetWeather xmlns=\"http://www.webserviceX.NET/\">"
"<CityName>%#</CityName>"
"<CountryName>%#</CountryName>"
"</GetWeather>"
"</soap:Body>"
"</soap:Envelope>", txtCity.text,txtCounrty.text];
//---print it to the Debugger Console for verification---
NSLog(#"%#",soapMsg);
NSURL *url = [NSURL URLWithString:
#"http://www.webservicex.net/globalweather.asmx"];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
//---set the various headers---
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapMsg length]];
NSLog(#"WebData....%#",soapMsg);
[req addValue:#"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[req addValue:#"http://www.webserviceX.NET/GetWeather" forHTTPHeaderField:#"SOAPAction"];
[req addValue:msgLength forHTTPHeaderField:#"Content-Length"];
//---set the HTTP method and body---
[req setHTTPMethod:#"POST"];
[req setHTTPBody:[soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
//---start animating--
[activityIndicator startAnimating];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
if(conn)
{
webData = [[NSMutableData data] retain];
NSLog(#"WebDatanew....%#",webData);
}
}
just include ASIHTTPRequest.Its much more easier to use.
http://allseeing-i.com/ASIHTTPRequest/
the web service takes three parameters:
rw_app_id: The unique identifier for the app. If you’ve been following along with the previous tutorial, there should be only one entry so far, App ID #1.
code: The code to attempt to redeem. This should be a string that’s entered by the user.
device_id: The device ID that is attempting to redeem this code. We can get this with an easy API call.
use:- ASIHTTPRequest
change your soapMsg format :
NSString *soapMsg = [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"
"<GetWeather xmlns=\"http://www.webserviceX.NET\">\n"
"<CityName>%#</CityName>"
"<CountryName>%#</CountryName>\n"
"</GetWeather>\n"
"</soap:Body>\n"
"</soap:Envelope>\n",txtCity.text,txtCounrty.text];
Use ASIHTTP Request and JSON Library to communicate with your web service. JSON is way better than XML feeds and its very easy to handle.
Download JSON library form Here
Here is the Documentation for ASIHTTP request :- http://allseeing-i.com/ASIHTTPRequest/
Hope this will help you. Thank you
May be this can help you. It contain one parameter
-(void)serverconnection{
NSString *CountryName=#"India";
NSString *soapMessage = [NSString stringWithFormat:#"<?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>"
"< GetWeather xmlns=\"http://tempuri.org/\">"
"<CountryName>%#</CountryName>"
"</GetWeather >"
"</soap:Body>"
"</soap:Envelope>",CountryName];
NSURL *myNSUObj=[NSURL URLWithString:#"http://www.webservicex.net/globalweather.asmx?op=GetCitiesByCountry"];
// NSURLRequest *myNSURequestObj=[NSURLRequest requestWithURL:myNSUObj];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:myNSUObj];
NSString *msgLength = [NSString stringWithFormat:#"%lu", (unsigned long)[soapMessage length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue: #"http://tempuri.org/GetWeather" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
myNSUConnectionObj=[[NSURLConnection alloc]initWithRequest:theRequest delegate:self];
NSLog(#"Data =%#",myNSUConnectionObj);
if(myNSUConnectionObj)
{
NSLog(#"successful connection");
myNSMDataFromServer=[[NSMutableData alloc]init];
}
}
Your webservice is different but may be this can give you idea.

Server did not recognize the value of HTTP Header SOAPAction in iPhone?

I am try to connect webservices to my code i got error as
"Server did not recognize the value of HTTP Header SOAPAction"
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:Body>\n"
"<Hello xmlns=\"http://viium.com/\">\n"
"<name>%#</name>\n"
"</Hello>\n"
"</soap:Body>\n"
"</soap:Envelope>\n", #"new"
];
NSLog(soapMessage);
NSURL *url = [NSURL URLWithString:#"http://viium.com/WebService/HelloWorld.asmx"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapMessage length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue: #"http://viium.com/Hello" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
Please guide me what iam missing?
NSURL *url = [NSURL URLWithString:#"https://servername.com/WebService/WebServicename.asmx"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%d",[soapMessage length]];
[theRequest addValue:#"text/xml" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue:#"servername.com/Hello" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue:msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
here is the link,
http://abhicodehelp.blogspot.com/2010/12/handling-soap-with-iphone.html
this may help you..
If it's your own web-service, check whether your "servername.com/Hello" in query equals namespace in Web-Service.
In ASP.Net it defines like:
[WebService(Namespace="servername.com/Hello")]