Objective-c:无法在没有有效操作参数的情况下处理请求。请提供有效的肥皂行动

时间:2014-04-14 14:26:14

标签: ios objective-c asmx wsdl2objc

我尝试使用wsdl2objc工具从objective-c使用ASMX Web服务。现在,我正在尝试使用temperature conversion web service

使用该工具,生成了用于使用服务的客户端类(我有used THIS link as reference来编写代码)。

但是,我不断收到这条肥皂故障消息"无法在没有有效动作参数的情况下处理请求。请提供有效的肥皂活动"。

虽然此错误消息非常清楚地表明我需要添加" SOAPAction"标题到我的请求标题,在这种情况下我不知道如何使用此wsdl2objc工具生成用于使用Web服务的客户端类。

我搜索了很长时间,但在我提到的所有链接中,没有提到objective-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];

    }
}

通过引用THIS link,我还尝试通过手动创建soap消息并拨打电话直接使用Web服务,但我将asmx网页的HTML作为响应! !我无法理解为什么我会得到这样的回应!!在运行本段开头提到的链接中给出的特定代码示例时,我甚至没有更改一行代码。

我对iOS编程完全陌生,可能会犯一些愚蠢的错误或遗漏一些非常微不足道的东西。有人可以帮忙吗?

如果需要更多信息,请告诉我。

谢谢。

更新
正如以下Priya所建议的,我检查了setHttpCallUsingBody方法中的soap动作头项。但是,我发现它已经被设定了。但我仍然得到同样的错误信息。检查下面的屏幕截图。肥皂行动不正确吗?应该是不同的东西吗?

enter image description here

2 个答案:

答案 0 :(得分:0)

SOAPAction标头包含在SOAP 1.1中 - 所以看起来您尝试使用的Web服务使用此并期望此标头。有关此标题的更多信息,请访问http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528

将HTTP标头添加到NSURLRequest非常简单。您使用在NSURLMutableRequest上定义的(void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field

具体来说,如果您使用我在文章中提到的wsdl2objc工具,您可以在BarracudaCloudAPISvc.m文件的- (void)sendHTTPCallUsingBody:(NSString *)outputBody soapAction:(NSString *)soapAction forOperation:(BarracudaCloudAPIBindingOperation *)operation方法中包含此标头。

答案 1 :(得分:0)

您是否使用SoapUI测试服务?只是为了确保服务正常运行。

就我个人而言,我更喜欢Wsdl2Code生成的代码,但可用生成器的一直带我到那里,Wsdl2Code是最容易理解的 ,不那么繁琐,我认为唯一一个不跳过base64文件。因此,与XMLDictionary一起,我只需要在适当的位置添加一些- (id)initWithDictionary:(NSDictionary *)dictionary;,然后使用BAM!你在那里。