I have implemented SOAP Service in iOS.
I am using the following code for sending the request.
NSString *sSOAPMessage = #"<?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>"
"<CelsiusToFahrenheit xmlns=\"http://www.w3schools.com/webservices/\">"
"<Celsius>50</Celsius>"
"</CelsiusToFahrenheit>"
"</soap:Body>"
"</soap:Envelope>";
NSURL *sRequestURL = [NSURL URLWithString:#"http://w3schools.com/webservices/tempconvert.asmx"];
NSMutableURLRequest *myRequest = [NSMutableURLRequest requestWithURL:sRequestURL];
NSString *sMessageLength = [NSString stringWithFormat:#"%d", [sSOAPMessage length]];
[myRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[myRequest addValue: #"http://www.w3schools.com/webservices/CelsiusToFahrenheit" forHTTPHeaderField:#"SOAPAction"];
[myRequest addValue: sMessageLength forHTTPHeaderField:#"Content-Length"];
[myRequest setHTTPMethod:#"POST"];
[myRequest setHTTPBody: [sSOAPMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:myRequest delegate:self];
if( theConnection ) {
webData = [[NSMutableData data] retain];
}else {
NSLog(#"Some error occurred in Connection");
}
And I am getting following response. Not getting any value i.e. Celsius or Fahrenheit value in response.
Check it works now:
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"
"<CelsiusToFahrenheit xmlns=\"http://www.w3schools.com/webservices/\"> <Celsius>25.5</Celsius> </CelsiusToFahrenheit>"
"</soap:Body>\n"
"</soap:Envelope>\n"
];
NSLog(soapMessage);
NSURL *url = [NSURL URLWithString:#"http://www.w3schools.com/webservices/tempconvert.asmx?op=CelsiusToFahrenheit"];
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://www.w3schools.com/webservices/CelsiusToFahrenheit" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[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");
}
Then get the response as:
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *data=[[NSString alloc]initWithFormat:#"%#",webData ];
// NSLog(#"DONE. Received Bytes: %d, \n %#", [webData length],data);
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
NSLog(#"Response is: %#",theXML);
}
Afterwords you need to parse it.
Related
I have an array that contains some index inside. When i log it out it looks like this:
item pass: (
80340025,
80319340,
80251277
)
My array is declared as NSAAray
Then I need to make a soap call to insert this each index of this array into the soap message. The question is how?
Here is my soap message.
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>"
" <IncidentQuery xmlns=\"https://www.monitoredsecurity.com/\">"
"<IncidentNumber>%d</IncidentNumber>"
"<MaxSignatures></MaxSignatures>"
"</IncidentQuery>"
"</soap:Body>"
"</soap:Envelope>", item_pass];
NSURL *url = [NSURL URLWithString:#"https://api.monitoredsecurity.com/SWS/incidents.asmx"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%lu", (unsigned long)[soapMessage length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue: #"https://www.monitoredsecurity.com/IncidentQuery" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
[connection start];
if(connection)
{
_webResponseData = [NSMutableData data] ;
}
else
{
NSLog(#"Connection is NULL");
}
do like this
-(void)SoapCallingMethod
{
for(int i=0;i<array.count;i++)
{
[self yourSoapMethod:[yourArray objectAtIndex:i]];
}
}
-(void)yourSoapMethod:(NSInteger )indexNumber
{
yourSoapMessage = [NSString stringWithFormat:"%d",indexNumber];
// Rest Steps
}
I'm trying to develop an app that uses data from a SOAP service. is the first time I use a SOAP service. After reading several tutorials I thought I would be able to set the request to the service in the right way but I always get errors in the response. What's wrong ?!
this is the code for the request
NSString *soapMessage = [NSString stringWithFormat:
#"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns1=\"http://microsoft.com/webservices/\">\n"
"<SOAP-ENV:Body>\n"
"<ns1:ListaComuni>\n"
"<Nazione>italia</Nazione>\n"
"</ns1:ListaComuni>\n"
"</SOAP-ENV:Body>\n"
"</SOAP-ENV:Envelope>\n"
];
NSURL *url = [NSURL URLWithString:#"http://www.xxxxx.xxx/XXXXX.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: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
When i receive the answer
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(#"DONE. Received Bytes: %d", [webData length]);
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
NSLog(#"RISPOSTA %#",theXML);
}
The log:
RISPOSTA <?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><ListaComuniResponse xmlns="http://microsoft.com/webservices/"><ListaComuniResult><anyType xsi:type="xsd:string">Object reference not set to an instance of an object.</anyType></ListaComuniResult></ListaComuniResponse></soap:Body></soap:Envelope>
I tested the XML request on http://wsdlbrowser.com and it all works.
What's wrong ?!
Thanks
Ok...
i found the error...the correct request is:
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>"
"<ListaComuni xmlns=\"http://microsoft.com/webservices/\">"
"<Nazione>%#</Nazione>\n"
"</ListaComuni>"
"</soap:Body>"
"</soap:Envelope>", nameInput.text
];
i am facing a problem while requesting server in SOAP format. when i am pasting the Soap envelope in the the browser(just for testing the web services) then it gives correct response. But when i am requesting from app then it give me irrelevant response.
I searched a lot on but every where i found the same technique for soap request.
Here is my code what i am using.
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"
"<ProfileLogin xmlns=\"http://tempuri.org/\">"
"<strLoginRequest>"
"<email>abc#gmail.com.au</email>"
"<password>123456</password>"
"</strLoginRequest>"
" </ProfileLogin>"
"</soap:Body>"
"</soap:Envelope>"
];
NSLog(soapMessage);
NSURL *url = [NSURL URLWithString:#"http://www.abc.com.au/mobileapp.asmx"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapMessage length]];
[theRequest setValue:#"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest setValue:msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setValue:#"http://tempuri.org/ProfileLogin" 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");
}
and getting response
<ProfileReply><Success>False</Success><Error>Data at the root level is invalid. Line 1, position 1.</Error></ProfileReply>
please some buddy let me know it is my fault of mycode or from server side.
Try
[theRequest setValue:#"application/soap+xml;charset = utf-8" forHTTPHeaderField:#"Content-Type"];
try this
[theRequest setValue:#"ProfileLogin" forHTTPHeaderField:#"SOAPAction"];
instead of
[theRequest setValue:#"http://tempuri.org/ProfileLogin" forHTTPHeaderField:#"SOAPAction"];
I am accessing xml web service in my iPhone application. But i am not able to get the appropriate data from the server. I am getting following error in connectionDidFinishLoading delegate method of NSURLConnection.
soap:ServerServer
was unable to process request. ---> Object reference not set to an
instance of an object.
Following is my code :
NSString *deviceID = [OpenUDID value];
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:Header>"
"<AuthHeader xmlns=\"http://tempuri.org/\">"
"<Username>admin</Username>"
"<Password>admin</Password>"
"</AuthHeader>"
"</soap:Header>"
"<soap:Body>"
"<WsGetAllDrugDetailsXML xmlns=\"http://tempuri.org/\">"
"<UserId>%d</UserId>"
"<IMEI>%#</IMEI>"
"</WsGetAllDrugDetailsXML>"
"</soap:Body>"
"</soap:Envelope>",[Appdelegate.UserID intValue],deviceID];
//---print it to the Debugger Console for verification---
NSLog(#"%#", soapMsg);
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:Appdelegate.wsURL];
//---set the various headers---
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapMsg length]];
[req addValue:#"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[req addValue:#"http://tempuri.org/WsGetAllDrugDetailsXML" forHTTPHeaderField:#"SOAPAction"];
[req addValue:msgLength forHTTPHeaderField:#"Content-Length"];
//---set the HTTP method and body---
[req setHTTPMethod:#"POST"];
[req setHTTPBody:[soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
if (conn) {
webData = [[NSMutableData data] retain];
}
I'm not able to predict what is going wrong from my side. Or it is the error from server side that i'm not receiving the data.
Please help me.Thanks in Advance!
Your Content-Length value is not correct:
The length must be in bytes. NSString's length method returns the number of UTF-16 code units.
You may fix it as follows:
NSData* bodyData = [soapMsg dataUsingEncoding:NSUTF8StringEncoding];
[req addValue:[NSString stringWithFormat:#"%d",(int)[bodyData length]] forHTTPHeaderField:#"Content-Length"];
[req setHTTPBody:bodyData];
i am sending a soap request. But no data is being returned. The web service does not return any error. I am unable to figure out what is wrong. Does it have something to do with the UTF8 Encoding? Please help. Below is my code:
NSString *xmlString = #"<ServiceCalls xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><ServiceCall><Phone_No>033542390843</Phone_No></ServiceCall></ServiceCalls>";
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"
"<GetVehiclesByPhone_ServiceCall_Proc xmlns=\"http://tempuri.org/\">\n"
"<xmlStr>%#</xmlStr>\n"
"<m_LoginId>Username</m_LoginId>\n"
"<m_pass>Password</m_pass>\n"
"</GetVehiclesByPhone_ServiceCall_Proc>\n"
"</soap:Body>\n"
"</soap:Envelope>", xmlString];
NSLog(#"%#", soapMessage);
NSURL *url = [NSURL URLWithString:#"http://103.9.23.21/TPL_Web_Services/TPLInterface.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://tempuri.org/GetVehiclesByPhone_ServiceCall_Proc" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLResponse *response;
NSError *error;
NSData *webData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error];
if (webData != nil) {
NSString *data = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding];
NSLog(#"Data: %#", data);
if (error == nil) {
if ([data isEqualToString:#"True"] || [data isEqualToString:#"true"]) {
[self showSuccessfulAlert];
[self storeDefaults];
[self.dataLayer notifySplashRemoved];
}
else {
/*UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Invalid Data!" message:#"The phone no. you entered is not registered." delegate:nil cancelButtonTitle:#"OK" otherButtonTitles: nil];
[alert show];*/
sendSMS = YES;
}
}
else {
sendSMS = YES;
}
}
else {
sendSMS = YES;
}
You need to set the Content-Length properly: the content length is the length of the body data in bytes, not the length of the NSString, which is the number of UTF-16 code units:
NSData* body = [soapMessage dataUsingEncoding:NSUTF8StringEncoding];
NSString* bodyLength = [NSString stringWithFormat:#"%d", [body count]];
[theRequest addValue: bodyLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPBody:body];
...