получение кода ответа 400 при отправке xml как сообщения в веб-сервис - PullRequest
1 голос
/ 18 января 2012

Я пытаюсь использовать веб-сервис, созданный на asp.net wcf с iPhone, для размещения некоторых данных в форме xml, но я получаю код ошибки 400. Я проверил его описание, и из него видно, что яне в состоянии создать правильный запрос.Может кто-нибудь, пожалуйста, помогите мне исправить мой код, который выглядит следующим образом:

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:
сервер имеет метод updateTimesheet, который ожидает класс в качестве параметра.Запрос определен как XM, а ответ определен как JSON

EDIT2:
ниже мой код для службы wcf:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "updateTimesheet", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
string UpdateTimesheetHours(string ts);

[DataContract] publicclass TimesheetHour {private int _TimesheetHourId;private int _TimesheetId;private DateTime _WorkedOn;private int _PlacementOvertimeId;частный десятичный _HoursWorked;приватная строка _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; }
}

} публичная строка UpdateTimesheetHours (TimesheetHour string) {return "success";}

EDIT3 Мой XML

<TimesheetHour>
<ContractNote>111</ContractNote>
<TimesheetHourId>222</TimesheetHourId>
<TimesheetId>333</TimesheetId>
<WorkedOn>444</WorkedOn>
<PlacementOvertimeId>555</PlacementOvertimeId>
<HoursWorked>666</HoursWorked>
<PerformancevalueId>777</PerformancevalueId>

Я вызываю функцию на сервере, которая ожидает строку в качестве параметра и ее тип запроса определенкак XML Спасибо

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Получите WireShark или Charles и более подробно изучите ваш запрос и ответ сервера. WireShark бесплатен, а X11 и Чарльз - 30 пробная версия и являются нативными.

Лично я использую Charles, загружаю, запускаю, и он ловит ваш сетевой трафик, это так просто.

0 голосов
/ 18 января 2012

Может быть, это неправильный формат Попробуйте отредактировать эти строки:

<?xml version="1.0" encoding="iso-8859-1"?>
<TimesheetHour>
 <ContractNote>aaa</ContractNote>
 <TimesheetHourId>bbbb</TimesheetHourId>
 <TimesheetId>cccc</TimesheetId>
 <WorkedOn>dd</WorkedOn>
 <PlacementOvertimeId>eee<PlacementOvertimeId>
 <HoursWorked>ffff</HoursWorked>
 <PerformancevalueId>ggg</PerformancevalueId>
</TimesheetHour>

Также убедитесь, что вы не передаете строку в параметры, которые требуют целочисленного значения . Это все, что я могу вам помочь, не вдаваясь в подробности.

Видя ваши правки, вы идентифицируете int в ваших веб-сервисах. вместо передачи чисел или ну, если вы передаете как @ "% i, iValue" Что-то, что вы создаете, как это По крайней мере, попробуйте передать номера.

...