Objective-c: невозможно обработать запрос без действительного параметра действия. пожалуйста, предоставьте действительное действие мыла
Я пытаюсь использовать веб-сервис ASMX из target-c с помощью инструмента wsdl2objc. Сейчас я пытаюсь использовать веб-сервис преобразования температуры.
Используя инструмент, клиентские классы были сгенерированы для использования сервиса (я использовал ЭТУ ссылку в качестве ссылки для написания кода).
Тем не менее, я постоянно получаю это сообщение о сбое мыла "Невозможно обработать запрос без действительного параметра действия. Пожалуйста, предоставьте действительное действие мыла".
Хотя в этом сообщении об ошибке очень четко говорится, что мне нужно добавить заголовок "SOAPAction" в заголовки моего запроса, я не знаю, как это сделать в этом случае при использовании этого инструмента wsdl2objc для генерации клиентских классов для использования веб-службы.
Я долго искал, но во всех ссылках, на которые я ссылался, не было упоминаний об этой ситуации, происходящей в target-c.
Пожалуйста, проверьте мой код ниже:
- (IBAction)submitClicked:(id)sender {
TempConvertSoap *binding = [TempConvertSvc TempConvertSoap];
TempConvertSoapResponse* response;
TempConvertSvc_CelsiusToFahrenheit* request = [[TempConvertSvc_CelsiusToFahrenheit alloc] init];
request.Celsius = self.txtCelcius.text;
response = [binding CelsiusToFahrenheitUsingParameters:request];
dispatch_async(dispatch_get_main_queue(), ^{
[self processResponse:response];
});
}
-(void) processResponse: (TempConvertSoapResponse *) soapResponse
{
NSArray *responseBodyParts = soapResponse.bodyParts;
id bodyPart;
@try{
bodyPart = [responseBodyParts objectAtIndex:0];
}
@catch (NSException* exception)
{
UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Server Error"message:@"Error while trying to process request" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
return;
}
if ([bodyPart isKindOfClass:[SOAPFault class]]) {
NSString* errorMesg = ((SOAPFault *)bodyPart).simpleFaultString;
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Server Error" message:errorMesg delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
else if([bodyPart isKindOfClass:[TempConvertSvc_CelsiusToFahrenheitResponse class]]) {
TempConvertSvc_CelsiusToFahrenheitResponse* tempResponse = bodyPart;
UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Success!" message:[NSString stringWithFormat:@"Result is %@", tempResponse.CelsiusToFahrenheitResult] delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
}
Ссылаясь на ЭТУ ссылку, я также попытался напрямую использовать веб-сервис, вручную создав мыльное сообщение и позвонив, но в ответ я получаю HTML-код веб-страницы asmx!! Я просто не могу понять, почему я получил такой ответ!! Я не изменил ни одной строки кода при выполнении этого конкретного примера кода, приведенного в ссылке, указанной в начале этого абзаца.
Я совершенно новичок в программировании на iOS и, возможно, делаю какую-то глупую ошибку или пропускаю что-то очень тривиальное. Может ли кто-нибудь любезно помочь?
Пожалуйста, дайте мне знать, если требуется дополнительная информация.
Спасибо.
Обновить:
Как предложил Priya ниже, я проверил элемент заголовка действия мыла в методе setHttpCallUsingBody. Тем не менее, я вижу, что это уже устанавливается. Но все же я получаю то же сообщение о неисправности. Проверьте скриншот экрана ниже. Не правильное ли мыло? Должно ли это быть что-то другое?
2 ответа
Вы тестировали сервис с SoapUI? Просто чтобы быть уверенным, что сервис работает.
Лично я предпочитаю коды, сгенерированные из Wsdl2Code, хотя ни один из доступных генераторов не взял меня туда полностью, Wsdl2Code - самый простой для понимания, менее трудоемкий, и я думаю, что единственный, который не пропускает файл base64. Так что с этим, наряду с XMLDictionary, мне просто нужно добавить несколько - (id)initWithDictionary:(NSDictionary *)dictionary;
где уместно и БАМ! Ты здесь.
Заголовок SOAPAction был включен в SOAP 1.1. Похоже, что веб-сервисы, которые вы пытаетесь использовать, используют это и ожидают этот заголовок. Подробнее об этом заголовке на http://www.w3.org/TR/2000/NOTE-SOAP-20000508/
Добавить заголовок HTTP в NSURLRequest очень просто. Ты используешь - (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
это определено на NSURLMutableRequest.
В частности, если вы используете инструмент wsdl2objc, о котором я упоминал в своей статье, вы можете включить этот заголовок в - (void)sendHTTPCallUsingBody:(NSString *)outputBody soapAction:(NSString *)soapAction forOperation:(BarracudaCloudAPIBindingOperation *)operation
метод в файле BarracudaCloudAPISvc.m.