Xml Parsing (WSDL format) not parse the data some times? - iphone

I am using Soap Web services and get response in XML and that Response i am store in NSMutableData and than i perform XML parsing i am using NSXMLParser. my problem is that some times it is works and some times not i can't determine what is the problem so anybody can help me to out of this problem.
I am using this code-
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapMessage length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue: #"http://MYLINK......." forHTTPHeaderField:#"MY_action"];
[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_msg = [[NSMutableData data] retain];
}
and getting also response in-
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[webData_msg appendData:data];
}
but after getting response parse the xml here-
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if( xmlParser_msg)
{
[xmlParser_msg release];
xmlParser_msg=nil;
}
xmlParser_msg = [[NSXMLParser alloc] initWithData: webData_msg];
[xmlParser_msg setDelegate: self];
[xmlParser_msg setShouldResolveExternalEntities: YES];
[xmlParser_msg parse];
[connection release];
[webData_msg release];
}
than problem arise here, some times NSXMLParserDelegate methods call some times not call.
What is going wrong here? please help and sorry for any mistake in English.

The problem was I was getting HTML response through web service so xml purser hangs on that.
It was sometimes errors coming from web service side with HTML content.

May be that should be the connection (or) unsuccessful parsing.You can check that by keeping
if(xmlParser parse)
{
blahblahblah
}
else
{
unsuccesful parsing
}

Related

WCF service not working for iPhone

I have a WCF service:
http://parentportal.technologyorg.com/ParentPortal.svc
which I have to access and get the data. but unfortunately I am getting some HTML code.
my code is as follows
-(IBAction)doit:(id)sender{
NSString *soapMessage = [NSString stringWithFormat:#"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://parentportal.technologyorg.com/ParentPortal.svc\"><SOAP-ENV:Body><GetDictionary></GetDictionary></SOAP-ENV:Body></SOAP-ENV:Envelope>"];
NSURL *url = [NSURL URLWithString:#"http://parentportal.technologyorg.com/ParentPortal.svc"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapMessage length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue: #"GetStudentTerms" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
[theRequest setHTTPMethod:#"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(#"%#",theRequest);
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
webData = [NSMutableData data] ;
}
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(#"___didReceiveResponse");
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSLog(#"Status code %d", [httpResponse statusCode]);
[webData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(#"___didReceiveData");
[webData appendData:data];
NSLog(#"%#",webData);
}
- (void) connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(#"___connectionDidFinishLoading");
NSLog(#"DONE. Received Bytes: %d", [webData length]);
NSString *xmlData = [[NSString alloc]
initWithBytes:[webData mutableBytes]
length:[webData length]
encoding:NSUTF8StringEncoding];
}
I am not sure whats going wrong were if I NSLog it I am the output as some HTML code.
Can any one help me on this.
Try SudzC SOAP-based web service definition WSDL files
Code generation for Objective-C libraries for iPhone development.
Follow the steps below

Call WSDL soap method in iPhone

i am working on an iPhone project in which i have a wsdl which is having description of methods and these methods contains an xml. I need to call these methods which are there in wsdl to get the xml using soap and parse it. I have read so many links and tutorials but was not able to to call the method in the wsdl. Please if u can provide me some links or suggestions.
you can use http://sudzc.com/ ,it gives you ready WSDL
This is a .NET web site solution that uses XSLT to transform SOAP-based web service definition WSDL files into complete code packages. The code that is generated is easy to read and update.
While SudzC supports multiple platforms, it's focus is on code generation for Objective-C libraries for iPhone development.
reference http://code.google.com/p/sudzc/
Please try this code. It worked for me.
[Note: GetDictionary is my method name which is displayed in Web service.and in url please write the url displayed in web service at below portion. It should be matched with url you have written in coding otherwise you will not get output(better copy it from web service)]
-(IBAction)loadData
{
NSString *soapMessage = [NSString stringWithFormat:
#"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
"<SOAP-ENV:Body>\n"
"<GetDictionary></GetDictionary>\n"
"</SOAP-ENV:Body>\n"
"</SOAP-ENV:Envelope>"];
NSURL *url = [NSURL URLWithString:#"http://c70.narolainfotech.local/WCFTest/RestServiceImpl.svc/basic"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:#"%d", [soapMessage length]];
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
[theRequest addValue: #"urn:RestServiceImpl/GetDictionary" forHTTPHeaderField:#"soapAction"];
// [theRequest addValue: #"urn:RestServiceImpl/getDataBY_ID" 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");
}
}
In connectionDidFinishLoading write following code:
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(#"DONE. Received Bytes: %d", [webData length]);
NSString *strData = [[NSString alloc]initWithData:webData encoding:NSUTF8StringEncoding];
NSLog(#"result : %#",strData);
NSString *result=nil;
NSString *str;
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
theXML = [theXML stringByReplacingOccurrencesOfString:#"<" withString:#"<"];
theXML = [theXML stringByReplacingOccurrencesOfString:#">" withString:#">"];
theXML = [theXML stringByReplacingOccurrencesOfString:#"&" withString:#"&"];
//NSLog(#"XML from Web-Service ======= \n\n %#",theXML);
NSArray *array=[theXML componentsSeparatedByString:#"<GetDictionaryResult>"];
for(int i=1;i<[array count];i++)
{
str=[array objectAtIndex:i];
NSRange ranfrom=[str rangeOfString:#"</GetDictionaryResult>"];
result =[str substringToIndex:ranfrom.location];
}
NSLog(#"result ::: %#",result);
}
Just Hope that it'll work for you. :)

How to post and get asmx web serivce access using iPhone app?

I am new to iPhone app development. How can I post data and get data by accessing the asmx web service using iPhone app?
I think asmx webservices are SOAP webservices you should read my blog entry here -
http://www.makebetterthings.com/iphone/call-soap-web-service-from-iphone/
To call a SOAP service first i create a string with the SOAP request as follows.
NSString *soapMessage = #"<?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>50</Celsius>n"
"</CelsiusToFahrenheit>n"
"</soap:Body>n"
"</soap:Envelope>n";
After creating the SOAP request I create a NSMutableRequest to send this request to server.
NSURL *url = [NSURL URLWithString:#"http://w3schools.com/webservices/tempconvert.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/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");
}
After firing the request we can collect the XML response in the NSURLConnection’s delegate methods.
-(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];
}
After collecting the XML response in theXML string in -(void)connectionDidFinishLoading:(NSURLConnection *)connection
we can parse this string using TBXML for any other XML parser you like.

HTTP Connection in Iphone

Since I'm new in iphone I need help in learning about http Connections in Iphone.
Please guide me to some tutorials so that I could learn some http connections tricks in iphone and could communicate with websites.
Also please guide me through some Sample code for the following problem:
I want to send some "Hello world" text to the site and got a reply back from the Web the same word with adiition of s i.e. "Hello Worlds".. please brothers guide me through any sample code.. it's a part of my application that I'm developing in iphone.
You may check this. ASIHTTPRequest package is a highly recommended tool for handling traffic on a iPhone app.
http://allseeing-i.com/ASIHTTPRequest/How-to-use
The best resource is the URL Loading System Programming Guide from Apple. Using NSURLConnection section contains a number of sample codes.
i too new ,but i have sent some msg(soap xml) via http request .my sample code is...
// get host address
NSURL *url = [NSURL URLWithString:#"http://xyz.com"];
NSMutableURLRequest *theRequest =[NSMutableURLRequest requestWithURL:url];
// find msg length, here x is my msg
NSString *msgLength = [NSString stringWithFormat:#"%d", [x length]];
// specify type of msg which u have to send to the host(mine is xml)
[theRequest addValue: #"text/xml; charset=utf-8" forHTTPHeaderField:#"Content-Type"];
// name space which optional one
[theRequest addValue: #"http://mpack.h.org" forHTTPHeaderField:#"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:#"Content-Length"];
//type of http method
[theRequest setHTTPMethod:#"POST"];
// msg which is need to send to server
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
// establish connection to host
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if( theConnection )
{
webData = [[NSMutableData data] retain];
NSLog(#"Connecting....");
}
else
{
NSLog(#"theConnection is NULL");
}
}
// delegate method for NSURLConnection
-(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 %#",error);
[connection release];
[webData release];
}
// u ll get response here
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(#"DONE. Received Bytes: %d", [webData length]);
}

get return result after post to server (from iphone)

I make iphone application, post parametes to JSP (test.jsp in server) from iphone. The following is my codes:
NSData *postData = [#"&test=123&field=456" dataUsingEncoding:NSUTF8StringEncoding];
NSString *postLength = [NSString stringWithFormat:#"%d", [postData length]];
// Init and set fields of the URLRequest
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:#"POST"];
[request setURL:[NSURL URLWithString:[NSString stringWithString:#"http://mydomain.com/test.jsp"]]];
[request setValue:#"application/x-www-form-urlencoded" forHTTPHeaderField:#"Content-Type"];
[request setValue:postLength forHTTPHeaderField:#"Content-Length"];
[request setHTTPBody:postData];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (connection) {
// Return data of the request
NSData *receivedData = [[NSMutableData data] retain];
}
[request release];
But my problem is: I can not get return result from JSP server.
How I can setup in JSP to get return result in iPhone? and in iPhone too?
Thank all
Do you implement this in your delegate:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
Data won't just magically appear in your receivedData instance. You need to implement the delegate methods for NSURLConnection. Take a look at Apple's documentation on how to this all properly.