【发布时间】:2013-12-05 14:03:33
【问题描述】:
我对 iOS 很陌生,正在尝试执行 REST 请求并获取一些 XML 数据,对其进行解析并理想地放入自定义对象中。但现在我被困在获取 XML 数据上。
我在 Github/AFNetworking 上找到了这段代码 sn-p..
- (void) fetchInterestData{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFXMLResponseSerializer new];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
它可以工作并获取一个 JSON 对象。但我想得到 XML..
如果我使用 http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=xml 代替,则有一个 xml 对象。但是现在代码完全崩溃了。我希望至少将 xml 作为字符串对象。
我需要更改什么来获取 xml,假设我想获取以下结构的 xml 对象:
<RootNode>
<Banks>
<Bank>
<BankId>17</BankId>
<BankName>Bluestep</BankName>
<BankUrl>http://www.bluestep.se</BankUrl>
<BankImage>
http://smartkalkyl.se/smartfiles/layout/banklogos/bluestep.png
</BankImage>
<Rates>
<Rate>
<RateDate>2013-12-05</RateDate>
<RateType>5</RateType>
<RateInterest>6,23</RateInterest>
<RateDescription/>
<RateBefore>6,27</RateBefore>
<RateChange>False</RateChange>
<RateBeforeDate>2013-08-13</RateBeforeDate>
</Rate>
</Rates>
</Bank>
<Bank>
...
我该怎么做?
更新:新代码..
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFHTTPRequestSerializer * requestSerializer = [AFHTTPRequestSerializer serializer];
NSString *ua = @"Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25";
[requestSerializer setValue:ua forHTTPHeaderField:@"User-Agent"];
[requestSerializer setValue:@"application/xml" forHTTPHeaderField:@"Content-type"];
manager.requestSerializer = requestSerializer;
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://smartkalkyl.se/rateapp.aspx?user=xxxx&pass=xxx"
parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSData * data = (NSData *)responseObject;
self.fetchedXML = [NSString stringWithUTF8String:[data bytes]];
//NSLog(@"Response string: %@", self.fetchedXML);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
但这给了我一个错误..
2013-12-06 00:04:10.657 TabbedDemo[38335:a0b] Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/xml" UserInfo=0x8d80ac0 {NSErrorFailingURLKey=http://smartkalkyl.se/rateapp.aspx?user=xxxx&pass=xxxx, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x8a75230> { URL: http://smartkalkyl.se/rateapp.aspx?user=xxxx&pass=xxxx } { status code: 200, headers {
"Cache-Control" = private;
"Content-Encoding" = deflate;
"Content-Length" = 1260;
"Content-Type" = "text/xml; charset=iso-8859-1";
Date = "Thu, 05 Dec 2013 23:03:47 GMT";
Server = "Microsoft-IIS/7.5";
"Set-Cookie" = "ASP.NET_SessionId=ad3zikxbh4bcawxulkhwt2j3; path=/; HttpOnly";
"X-AspNet-Version" = "4.0.30319";
"X-Powered-By" = "UrlRewriter.NET 2.0.0, ASP.NET";
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/xml}
知道可能是什么问题吗?
我在应用程序的 Android 版本中进行了类似的操作,这是在那里工作的代码并且工作正常。我从来没有在那里设置任何内容类型..
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpProtocolParams.setUserAgent(httpClient.getParams(),
System.getProperty("http.agent"));
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
【问题讨论】:
-
好吧,您不应该假设 AFN 是 XML 解析器或 JSON 解析器。只有一些方便的功能,例如“JSON Response Serializer”,严格来说不需要成为网络库的一部分。您可以使用几行代码完成相同的 JSON 序列化器功能。解析 XML 更复杂,但您可以编写自己的 XML 序列化程序或使用“内置”
AFXMLParserResponseSerializer,如果这适合您的需要。 -
解析 XML 是我的次要目标。最初我只想从服务器检索 XML 作为字符串或类似的。
标签: ios afnetworking