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.

Другие вопросы по тегам