0

「 http://xxx.xxx.xx.xxx/WebSiteServices.svc?wsdl 」などの Web サービスへの接続を必要とするアプリ iOS を作成しています。

このアプリでは、いくつかのフィールドを選択した後、荷物のある旅行の見積もりを作成できます。

  • 原産国(原産国のリスト);

  • 仕向国(仕向国のリスト);

  • 荷物の 5 つの ID に対する 5 つの識別フィールド。それぞれ異なる ID を持つバッグの数を選択できます。

Web サービスと通信するために、次のリンクで説明されているように SOAP 呼び出しを行いまし

国と荷物のリストの受信に成功しましたが、選択したデータを Web サービスに送信して "calcolaImporto" (金額の計算) メソッドを呼び出すことができません。SOAP メッセージを送信する必要があります。

  • idPaesePrelievo: 原産国の ID (整数: OK、成功しました);

  • idPaeseDest: 目的地の国の ID (整数: OK、成功しました);

  • idProdotti: 選択したストレージの ID を識別する整数のリスト (問題: 配列を送信できません);

  • qtaProdotti: 最初のリストごとに選択された荷物 ID の量を識別する整数のリスト (問題: 配列を送信できません)。

2 つのリストは互いに接続されていませんが、これら 2 つの配列を Web サービスに送信できません。

Xcodeの2つの配列がオブジェクトIDの2つのリストで構成されている場合でも、Webサービスの配列は整数の2つのリストで構成されています(idからintへのキャストも試みましたが、何もしませんでした)。

メソッドにアクセスしましたが、荷物がチェックされていないため、結果は「0」です。どうすればよいですか?

助けてください、ありがとう!

以下に、「ViewController.m」のコードを掲載しました。

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize amount, idPaeseDest, idPaesePrelievo, idProdotti, qtaProdotti;
/* amount (TEXTFIELD), idPaeseDest (INT), idPaesePrelievo (INT), idProdotti (NSMUTABLEARRAY), qtaProdotti (NSMUTABLEARRAY) */

- (void)viewDidLoad {
[super viewDidLoad];
}

- (IBAction)calcolaImporto:(id)sender {
// Create the SOAP message
NSString *soapMsg = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                     "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                     "<soap:Body>"
                     "<CalcolaImporto xmlns=\"http://tempuri.org/\">"
                     "<idPaesePrelievo>%d</idPaesePrelievo>"
                     "<idPaeseDest>%d</idPaeseDest>"
                     "<idProdotti>%@</idProdotti>"
                     "<qtaProdotti>%@</qtaProdotti>"
                     "</CalcolaImporto>"
                     "</soap:Body>"
                     "</soap:Envelope>", idPaesePrelievo, idPaeseDest, idProdotti, qtaProdotti];
// Create the URL
NSURL *url = [NSURL URLWithString: @"http://xxx.xxx.xx.xxx/WebSiteServices.svc?wsdl"];
// Create the request
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d",[soapMsg length]];
[req addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[req addValue:@"http://tempuri.org/IBagExpressServices/CalcolaImporto" forHTTPHeaderField:@"SOAPAction"];
[req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[req setHTTPMethod:@"POST"];
[req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
if (conn) {
    webData = [[NSMutableData data] retain];
}
}

-(void) connection:(NSURLConnection *) connection didReceiveResponse:(NSURLResponse *) response {
    [webData setLength: 0];
}

-(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) data {
[webData appendData:data];
}

-(void) connection:(NSURLConnection *) connection didFailWithError:(NSError *) error {
UIAlertView *errore = [[UIAlertView alloc] initWithTitle:@"ERROR" message:@"Connection problem" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errore show];
[errore release];
[webData release];
[connection release];
}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
NSLog(@"Ok. Byte: \n %d", [webData length]);
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
NSLog(@"theXML: \n %@", theXML);
[theXML release];
if (xmlParser) {
    [xmlParser release];
}
xmlParser = [[NSXMLParser alloc] initWithData: webData];
[xmlParser setDelegate:self];
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
[connection release];
[webData release];
}

-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict {
if ([elementName isEqualToString:@"CalcolaImportoResponse"])
    soapResults = [[NSMutableString alloc] init];
elementFound = YES;
}

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string {
if (elementFound)
    [soapResults appendString:string];
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

if ([elementName isEqualToString:@"CalcolaImportoResult"])
    amount.text=soapResults;

elementFound = FALSE;
}

- (void)dealloc {
[amount release];
[soapResults release];
[super dealloc];
}
@end
4

2 に答える 2

0

整数のリストでを作成し、NSStringそれらを で区切っ,て代わりに送信することはできませんか?

NSMutableString *mutableList = [[NSMutableString alloc ]initWithString:@"<q14:ArrayOfint>"];
//I'll say like this because i don't know if you added them as NSNumber or NSString
for(int i = 0 ;i < idProdotti.count;i++)
{
NSInteger value = [[idProdotti objectAtIndex:i]integerValue];

  [mutableList appendFormat:@"<arr:int>%d</arr:int>",value];

 }
[mutableList appendFormat:@"</q14:ArrayOfint>"];

mutableListそしてそれを送信releaseします。//qtaProdotti の 2 つ目

NSMutableString *mutableList1 = [[NSMutableString alloc ]initWithString:@"<q15:ArrayOfint>"];
//I'll say like this because i don't know if you added them as NSNumber or NSString
for(int i = 0 ;i < qtaProdotti.count;i++)
{
NSInteger value = [[qtaProdotti objectAtIndex:i]integerValue];

  [mutableList1 appendFormat:@"<arr:int>%d</arr:int>",value];

 }
[mutableList1 appendFormat:@"</q15:ArrayOfint>"];

mutableList1そしてそれを送信releaseします。

于 2013-07-06T17:58:11.963 に答える
0

私はこのように解決しました:

  • Web サービスと対話するためのグラフィカル インターフェイスである "SoapUI" を使用し、SOAP メッセージを書き直しました。

  • 「ソリンゴッド」を示したものと同様の 2 つのリストを使用しました。

正しいコードは次のとおりです。

NSMutableString *idLista = [[NSMutableString alloc] init];
for(int i=0; i<idProdotti.count; i++) {
    NSInteger value = [[idProdotti objectAtIndex:i] integerValue];
    [idLista appendFormat:@"<arr:int>%d</arr:int>",value];
}

NSMutableString *qtaLista = [[NSMutableString alloc] init];
for(int i=0; i<qtaProdotti.count; i++) {
    NSInteger value = [[qtaProdotti objectAtIndex:i] integerValue];
    [qtaLista appendFormat:@"<arr:int>%d</arr:int>",value];
}

NSString *soapMsg = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                 "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem="http://tempuri.org/\" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays\">"
                 "<soapenv:Body>"
                 "<tem:CalcolaImporto>"
                 "<tem:idPaesePrelievo>%d</tem:idPaesePrelievo>"
                 "<tem:idPaeseDest>%d</tem:idPaeseDest>"
                 "<tem:idProdotti>%@</tem:idProdotti>"
                 "<tem:qtaProdotti>%@</tem:qtaProdotti>"
                 "</tem:CalcolaImporto>"
                 "</soapenv:Body>"
                 "</soapenv:Envelope>", idPaesePrelievo, idPaeseDest, idLista, qtaLista];

[...]
于 2013-07-10T11:17:44.610 に答える