我正在尝试将AFNetworking与基于XML-RPC的API一起使用,同时使用GDataXML作为我的XML解析和创建类。
我已经成功地编写了一些方法,可以根据API的规范输出正确的XML请求,我还使用apigee控制台测试了这个XML请求,并验证了我每次使用apigee-console和API都得到了正确的响应。
现在是AFNetworking,我编写了以下代码,这些代码有时有效,但很少有效。
NSMutableURLRequest *request = [[FZAPIClient sharedClient] requestForDataServiceQueryOnTable:@"Contact" usingQueryData:@{ @"LastName" : @"Wagner" } forFields:@[ @"FirstName", @"LastName" ] withLimit:1000 forPage:0];
AFHTTPRequestOperation *operation = [[FZAPIClient sharedClient] HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSError *error = nil;
GDataXMLDocument *opdoc = [[GDataXMLDocument alloc] initWithData:[[operation request] HTTPBody] options:0 error:&error];
if (error) {
NSLog(@"Error creating XML: %@", error);
}
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:responseObject options:0 error:nil];
GDataXMLElement *element = [doc rootElement];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[FZAPIErrorHandler handleError:error];
}];
[operation start];
- (NSMutableURLRequest *)requestForDataServiceQueryOnTable:(NSString *)table usingQueryData:(NSDictionary *)queryData forFields:(NSArray *)fields withLimit:(NSInteger)limit forPage:(NSInteger)page;
的实现
- (NSMutableURLRequest *)requestForDataServiceQueryOnTable:(NSString *)table
usingQueryData:(NSDictionary *)queryData
forFields:(NSArray *)fields
withLimit:(NSInteger)limit
forPage:(NSInteger)page {
GDataXMLDocument *xmlDocument = [FZXMLGenerator requestForDataServiceQueryOnTable:table
usingQueryData:queryData
forFields:fields
withLimit:limit
forPage:page];
NSMutableURLRequest *request = [self requestWithMethod:@"POST" path:@"" parameters:nil];
[request setHTTPBody:[xmlDocument XMLData]];
[request setHTTPMethod:@"POST"];
return request;
}
当请求成功时,我得到了一个例外的答复。
当请求不起作用时(99%的时间),我会得到以下响应。
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value>
<i4>0</i4>
</value>
</member>
<member>
<name>faultString</name>
<value>Failed to parse XML-RPC request: Premature end of file.</value>
</member>
</struct>
</value>
</fault>
</methodResponse>
这让我怀疑HTTPBody属性发生了什么,我几乎在任何我能想到的地方都添加了日志记录,并看到XML在触发请求时确实附加到了请求上。它仍然可以通过完成块中的操作进行访问。
有什么想法吗?
看起来就像在请求中设置内容类型一样简单。
将方法更新为
- (NSMutableURLRequest *)requestForDataServiceQueryOnTable:(NSString *)table
usingQueryData:(NSDictionary *)queryData
forFields:(NSArray *)fields
withLimit:(NSInteger)limit
forPage:(NSInteger)page {
GDataXMLDocument *xmlDocument = [FZXMLGenerator requestForDataServiceQueryOnTable:table
usingQueryData:queryData
forFields:fields
withLimit:limit
forPage:page];
NSMutableURLRequest *request = [self requestWithMethod:@"POST" path:@"" parameters:nil];
[request setHTTPBody:[xmlDocument XMLData]];
[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
return request;
}
解决了问题,注意行[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
为了使所有请求都具有全局性,我在- (id)initWithBaseURL:(NSURL *)url;
实现中添加了[self setDefaultHeader:@"Content-Type" value:@"application/xml"];
行。