XML解析および作成クラスとしてGDataXMLを使用しながら、XML-RPCベースのAPIでAFNetworkingを使用しようとしています。
APIの仕様に従って適切なXMLリクエストを出力するいくつかのメソッドを正常に記述しました。また、apigeeコンソールを使用してこのXMLリクエストをテストし、apigeeコンソールと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が実際にリクエストに添付されていることを確認できます。また、完了ブロックの操作を介してアクセスすることもできます。
何か案は?