我需要将此数组作为参数传递给 SOAP API。后端实现者对构建 API (C#/.NET) 很陌生,我以前从未实现过此类 API。有 4-5 个与此相关的 Stack Overflow 问题,但没有一个是我查询的解决方案。
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2", nil];
NSString *soapURL = @"http://tempuri.org/IService1/addRecord";
NSString *soapBody = [NSString stringWithFormat:@"<addRecord xmlns=\"http://tempuri.org/\">"
"<id>%@</id>"
"<title>%@</title>"
"<record>%@</record>"
"</addRecord> \n” ,@“1”,@“abc", arr ];
NSLog(@"%@",soapBody);
错误:
字符串中的值格式化程序在尝试反序列化消息时引发异常:反序列化操作“addRecord”的请求消息正文时出错。预期来自名称空间“http://tempuri.org/”的结束元素“记录”。找到文字 '( 1、 2 )'.
我知道的一件事是我无法将数组直接传递给
soapBody
。有什么替代方案吗?
API 在后端运行良好。
一些评论:
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2", nil];
请写现代形式:
NSArray *arr = @[@"1",@"2"];
此外,您的问题充满了错误类型的引用(
“1”
)。确保使用常规引号,即 "
。
当您将“stringWithFormat”与 %@ 一起使用并提供一个数组时,您必须了解您将得到什么。让我们尝试一下:
NSArray *arr = @[@"1",@"2"];
NSString *str = [NSString stringWithFormat:@"<%@>", arr];
NSLog(@"%@", str);
结果是:
<(
1,
2
)>
这意味着您在
<record>
和 </record>
之间插入了两个用逗号分隔并用括号括起来的数字,再加上一些 \n
。
这是您的服务器所期望的吗?
所以我没有解决你的问题,但你必须以正确的方式格式化你的字符串并使用 NSLog 命令验证它。希望对您有帮助。
编辑
例如,如果您需要提供
<value>...</value>
内的数组值,则可以执行以下操作:
NSArray *arr = @[@"1", @"2"];
NSMutableString *mStr = [NSMutableString string];
for (NSString *value in arr) {
[mStr appendFormat:@"<value>%@</value>", value];
}
NSLog(@"<record>%@</record>", mStr);
结果将会是
<record><value>1</value><value>2</value></record>
最后我用这段代码解决了这个问题:
NSString *soapBody = [NSString stringWithFormat:@"< addRecord xmlns=\"http://tempuri.org/\" xmlns:arr=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\" > \n"
"<ID>1</ID>\n"
"<title>ABC</title>\n"
"<record>\n"];
for (int i=0; i<arrRecord.count; i++) {
soapBody = [NSString stringWithFormat:@"%@ <arr:int>%@</arr:int>\n",soapBody,arrRecord[i]];
}
soapBody = [NSString stringWithFormat:@"%@ </record></addRecord> \n",soapBody];
我需要在父节点中定义“arr”,并在记录数组中定义元素类型(int)。