AFNetworking с GDataXML как HTTPBody для XML-RPC API

Я пытаюсь использовать AFNetworking с API на основе XML-RPC, используя GDataXML в качестве класса анализа и создания XML.

Я успешно написал несколько методов, которые выводят правильный XML-запрос в соответствии со спецификацией API, я также протестировал этот XML-запрос с помощью консоли apigee и подтвердил, что каждый раз получаю правильный ответ с помощью консоли 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 действительно присоединяется к запросу при его запуске. Это также все еще доступно через операцию в блоке завершения.

Есть идеи?

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

Чтобы сделать это глобальным для всех запросов, я добавил строку, [self setDefaultHeader:@"Content-Type" value:@"application/xml"]; к моему - (id)initWithBaseURL:(NSURL *)url; реализация.

Другие вопросы по тегам