我尝试使用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动作头项。但是,我发现它已经被设定了。但我仍然得到同样的错误信息。检查下面的屏幕截图。肥皂行动不正确吗?应该是不同的东西吗?
答案 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!你在那里。