I am trying to use a web service built on asp.net wcf from iPhone to POST some data in the form of xml but I am getting the error code 400. I have checked its description and it looks from it that I am not able to create a proper request. can someone please help me in correcting my code which is following:
NSString *urlString = [NSString stringWithFormat:@"http://172.xxx.xxx.xxx:1230/Service.svc/updateTimesheet"];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[[NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"<TimesheetHour><ContractNote>111</ContractNote><TimesheetHourId>222</TimesheetHourId><TimesheetId>333</TimesheetId><WorkedOn>444</WorkedOn><PlacementOvertimeId>555</PlacementOvertimeId><HoursWorked>666</HoursWorked><PerformancevalueId>777</PerformancevalueId></TimesheetHour>"] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];
NSHTTPURLResponse* urlResponse = nil;
NSError *error = [[NSError alloc] init];
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"Response Code: %d", [urlResponse statusCode]);
if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) {
NSLog(@"Response: %@", result);
//here you get the response
}
EDIT1:
server has a method updateTimesheet which expects a class as parameter. The request is defined as XM and response is defined as JSON
EDIT2:
below is my code for wcf service:
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "updateTimesheet", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
string UpdateTimesheetHours(string ts);
[DataContract]
public class TimesheetHour
{
private int _TimesheetHourId;
private int _TimesheetId;
private DateTime _WorkedOn;
private int _PlacementOvertimeId;
private decimal _HoursWorked;
private string _contractorNote = string.Empty;
private int _performancevalueId = 0;
[DataMember]
public string ContractorNote
{
get { return _contractorNote; }
set { _contractorNote = value; }
}
[DataMember]
public int TimesheetHourId
{
get { return _TimesheetHourId; }
set { _TimesheetHourId = value; }
}
[DataMember]
public int TimesheetId
{
get { return _TimesheetId; }
set { _TimesheetId = value; }
}
[DataMember]
public DateTime WorkedOn
{
get { return _WorkedOn; }
set { _WorkedOn = value; }
}
[DataMember]
public int PlacementOvertimeId
{
get { return _PlacementOvertimeId; }
set { _PlacementOvertimeId = value; }
}
[DataMember]
public decimal HoursWorked
{
get { return _HoursWorked; }
set { _HoursWorked = value; }
}
[DataMember]
public int PerformancevalueId
{
get { return _performancevalueId; }
set { _performancevalueId = value; }
}
}
public string UpdateTimesheetHours(TimesheetHour string)
{
return “success”;
}
EDIT3
My XML
<TimesheetHour>
<ContractNote>111</ContractNote>
<TimesheetHourId>222</TimesheetHourId>
<TimesheetId>333</TimesheetId>
<WorkedOn>444</WorkedOn>
<PlacementOvertimeId>555</PlacementOvertimeId>
<HoursWorked>666</HoursWorked>
<PerformancevalueId>777</PerformancevalueId>
i am calling a function on server which expects a string as paremeter and its request type is defined as XML
Thanks
Get WireShark or Charles and inspect your request and the server response in more detail. WireShark is free and X11 and Charles has a 30 trial and is native.
Personally I use Charles, down load, launch and it is catching your network traffic, it’s that easy.