1

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が実際にリクエストに添付されていることを確認できます。また、完了ブロックの操作を介してアクセスすることもできます。

何か案は?

4

1 に答える 1

0

リクエストでコンテンツタイプを設定するのと同じくらい簡単だったようです。

メソッドをに更新する

- (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"];

すべてのリクエストでこれをグローバルにするため[self setDefaultHeader:@"Content-Type" value:@"application/xml"];に、- (id)initWithBaseURL:(NSURL *)url;実装に行を追加しました。

于 2012-09-04T03:38:19.647 に答える