如何使用AFNetworking发送XML POST请求

时间:2013-06-23 16:50:59

标签: ios objective-c xml post afnetworking

阅读大量答案,但没有找到简单的答案: 如何通过POST和使用AFNetworking将简单的XML发送到URL?

<?xml version=’1.0’ encoding=’UTF-­‐8’?>
<data>
<login>LOGIN</login>
<password>PASSWORD</password>
</data>

网址例如:http://example.com/API/balance.php

当我使用时:

NSDictionary *params = @{@"login":@"login",@"password":@"password"};
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[client setDefaultHeader:@"Content-Type" value:@"application/xml"];
[client postPath:@"balance.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
... some code ...
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error retrieving data: %@", error);
}];

我总是从API获取带有错误的XML:错误第1行中的格式不正确(无效令牌)

当我使用HTTP嗅探器时,我看到Content-Type:application / x-www-form-urlencoded;字符集= UTF-8

可能这是问题,但我不确切知道。 使用带curl的php - 从API获得正确的答案。

有人能用这个XML请求和URL显示工作示例吗?

2 个答案:

答案 0 :(得分:3)

那是因为默认[AFHTTPClient parameterEncoding]AFFormURLParameterEncoding。不幸的是,没有AFXMLParameterEncoding这样的编码,所以我手动创建XML并将其设置在NSMutableURLRequest上:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[client setDefaultHeader:@"Content-Type" value:@"application/xml"];

NSString *xml = [NSString stringWithFormat:@"<?xml version=’1.0’ encoding='UTF-­‐8'?><data><login>%@</login><password>%@</password></data>", user, password];
NSMutableURLRequest *req = [self requestWithMethod:@"POST" path:@"autenticacao" parameters:nil];
req.HTTPBody = [xml dataUsingEncoding:NSUTF8StringEncoding];

AFKissXMLRequestOperation *op = [AFKissXMLRequestOperation XMLDocumentRequestOperationWithRequest:req success:^(NSURLRequest *request, NSHTTPURLResponse *response, DDXMLDocument *XMLDocument) {

    NSLog(@"%@", XMLDocument);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, DDXMLDocument *XMLDocument) {
    NSLog(@"%@", error);
}];
[client enqueueHTTPRequestOperation:op];

我还使用AFKissXMLRequestOperation,这是AFNetworking的扩展,可以更轻松地解析响应中的XML。

答案 1 :(得分:0)

client上,请务必设置要使用的请求操作类型:

[client registerHTTPOperationClass:[AFXMLRequestOperation class]];