【问题标题】:AFNetworking with GDataXML as HTTPBody for XML-RPC APIAFNetworking 使用 GDataXML 作为 XML-RPC API 的 HTTPBody
【发布时间】:2012-09-03 23:24:43
【问题描述】:

我正在尝试将 AFNetworking 与基于 XML-RPC 的 API 一起使用,同时使用 GDataXML 作为我的 XML 解析和创建类。

我已经成功编写了一些根据 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 在触发时确实附加到了请求上。它仍然可以通过完成块中的操作访问。

有什么想法吗?

【问题讨论】:

    标签: ios xml xml-rpc afnetworking gdataxml


    【解决方案1】:

    看起来就像在请求中设置内容类型一样简单。

    更新方法

    - (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"]; 这一行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多