AFNetworking 2.x.x 中的 AFJSONParameterEncoding

2024-02-22

我正在实施以下贝宝 REST API:

curl -v https://api.sandbox.paypal.com/v1/vault/credit-card \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer {accessToken}' \
-d '{
 "payer_id":"user12345",
 "type":"visa",
 "number":"4417119669820331",
 "expire_month":"11",
 "expire_year":"2018",
 "first_name":"Joe",
 "last_name":"Shopper"
}'

我已经使用以下代码在 AFNetworking 1.3.3 中成功实现了此 api。在哪里PPWebService是的子类AFHTTPClient

[[PPWebService sharedClient] setParameterEncoding:AFJSONParameterEncoding];
    [[PPWebService sharedClient] setDefaultHeader:@"Content-Type" value:@"application/json"];
    [[PPWebService sharedClient] setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"Bearer %@", accessToken]];

    [[PPWebService sharedClient] postPath:@"vault/credit-card"
                               parameters:creditCard
                                  success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        NSDictionary *response = [self JSONToObject:operation.responseString];

        creditCardId = response[@"id"];

        if(creditCardId)
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Credit card" message:@"Saved !!" delegate:nil cancelButtonTitle:@"on" otherButtonTitles:nil];

            [alert show];
        }
    }
                                  failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Credit card" message:error.description delegate:nil cancelButtonTitle:@"on" otherButtonTitles:nil];

        [alert show];
    }];

我想在我的项目中使用 AFNetworking 2.x.x。但我无法用这个新版本做到这一点。

我有子类AFHTTPRequestOperationManager。我搜索互联网,人们建议我使用AFJSONRequestSerializer。所有其他代码都非常相似。但我也遇到了错误的请求错误。

那么如何在 AFNetworking 2.x.x 中使用 POST 方法发送原始 JSON 字符串?

EDIT

AFNetworking 2.X.X 的代码 https://www.dropbox.com/sh/1sfurycnq74irf0/tiunVnOFD_

错误状态: 404 错误请求

Response :

{"name":"MALFORMED_REQUEST","message":"The request JSON is not well formed.","information_link":"https://developer.paypal.com/docs/api/#MALFORMED_REQUEST","debug_id":"ab3c1dd874a07"}

我通过使用 Postman 得到了正确的响应,如下面的屏幕截图所示。


所以最后我得到了答案。我使用的子类AFHTTPSessionManager在我的项目中实现API。并将其与单例对象一起使用。这就是我的单例方法。

+ (MASWebService *)APIClient
{
    static MASWebService *_sharedClient = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^
    {
        NSURL *baseURL = [NSURL URLWithString:BaseURL];

        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

        _sharedClient = [[MASWebService alloc] initWithBaseURL:baseURL sessionConfiguration:config];

        _sharedClient.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

        _sharedClient.requestSerializer = [AFJSONRequestSerializer serializer];

        [_sharedClient.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    });

    return _sharedClient;
}

主要关键行是将请求序列化器 HTTP 标头“Content-Type”设置为“application/json”

如果你没有子类化AFHTTPSessionManager并使用AFHTTPRequestOperationManager对于单个请求也可以工作,因为AFHTTPRequestOperationManager也符合AFURLRequestSerialization协议作为属性AFHTTPRequestSerializer。我还没有做过,但它应该看起来像这样。

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    NSDictionary *parameters = @{@"foo": @"bar"};

    manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];       
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

    [manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

我希望这会起作用。如果我有什么地方错了,请在评论中告诉我。

Source : AFNetworking 2.0 POST 请求工作示例代码片段 http://techipost.com/2014/07/22/afnetworking-2-0-post-request-working-example-code-snippet/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AFNetworking 2.x.x 中的 AFJSONParameterEncoding 的相关文章

随机推荐