Tag Archives: Webservices

Making a POST in Objective-C (Xcode) to SharePoint Webservice requiring Windows NTLM Authenticaton for iPhone or Ipad

Xcode logoIn my previous posts I was talking about how to use SOAP to SharePoint Webservices using different programing languages (PHP, Android – Java). I found it very convenient to be able to publish also a sample how to do the same in Xcode (Objective-C).

I also had to browse the web quite a bit. Finilly I stumbeled upon article from Ravi Dixit about the tipical webservice changing celsius to fahrenheit. Becase I was missing some steps in the code Erhan Demirci steped in. Because I also needed to authenticate this article came handy. I connected the dots, changed the SOAP request and displayed the responce in the screen (also in the log).

When creating new project in Xcode just choose View-based Application, name it “SoapSharePoint” and copy-paste the code below.

The SoapSharePointController.h code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#import <UIKit/UIKit.h>

@interface SoapSharePointViewController : UIViewController <NSXMLParserDelegate> {

    IBOutlet UILabel *output;
    NSMutableData *webData;
    NSXMLParser *xmlParser;
    NSString *finaldata;
    NSString *convertToStringData;
    NSMutableString *nodeContent;

}
@property (nonatomic,retain) UILabel *output;
-(IBAction)invokeService;

@end

And the SoapSharePointController.m file:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#import "SoapSharePointViewController.h"

@implementation SoapSharePointViewController
@synthesize output;

-(IBAction)invokeService
{
   
        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"
                                "<GetListCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" />\n"
                                "</soap:Body>\n"
                                "</soap:Envelope>\n"];

       
       
        NSLog(@"The request format is %@",soapFormat);
       
        NSURL *locationOfWebService = [NSURL URLWithString:@"http://localhost/_vti_bin/lists.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://schemas.microsoft.com/sharepoint/soap/GetListCollection" 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");
        }
   
}


//NSURLConnection delegate method

-(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", [webData length]);
    NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    NSLog(@"%@",theXML);
   
    convertToStringData = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding];
   
    output.numberOfLines = 0;
    output.text = convertToStringData;
    [output sizeToFit];
   
    [connection release];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
    [super viewDidUnload];
}


- (void)dealloc {
    [output release];
    [convertToStringData release];
    [super dealloc];
}

@end

Also don’t forget to create a label and a button in the XIB (nib) file. Connect the the File’s Owner in outlets output to label and in the received action invokeService to button.

Or you can simply download it.