1

我正在尝试使用 AFNetworking 向服务器发送 POST 请求,并且一切似乎都在工作,即应用程序正在成功地 ping 服务器。但是,它发送的参数值在到达服务器时是空白的,即使在使用调试器单步执行下面的代码后,这些值似乎已成功传递。对此的任何帮助将不胜感激。

APIClient.m

#import "APIClient.h"
#import "AFJSONRequestOperation.h"

// Removed URL for privacy purposes.
static NSString * const kAPIBaseURLString = @"string goes here";

@implementation APIClient

+ (APIClient *)sharedClient {
    static APIClient *_sharedClient;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[APIClient alloc] initWithBaseURL:[NSURL URLWithString:kAPIBaseURLString]];
    });

    return _sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];
    if (self) {
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];

        // Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
        [self setDefaultHeader:@"Accept" value:@"application/json"];
    }

    return self;
}

@end

LoginBrain.m 中的登录方法

- (void)loginUsingEmail:(NSString *)email andPassword:(NSString *)password withBlock:(void (^)(NSDictionary *loginResults))block {
    self.email = email;
    self.password = password;

    // Removed path for privacy purposes
    [[APIClient sharedClient] postPath:@"insert path here" parameters:[NSDictionary dictionaryWithObjectsAndKeys:email, @"uname", password, @"pw", nil] success:^(AFHTTPRequestOperation *operation, id responseJSON) {
        if (block) {
            block(responseJSON);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);

        if (block) {
            block(nil);
        }
    }];

    // Store user data in app?
}

LoginViewController.m 中的登录调用方法

- (IBAction)loginPressed {
    [self.loginProgressIndicator startAnimating];
    NSString *email = self.emailTextField.text;
    NSString *password = self.passwordTextField.text;

    [self.brain loginUsingEmail:email andPassword:password withBlock:^(NSDictionary *loginResults) {
        [self.loginProgressIndicator stopAnimating];
        [self.delegate uloopLoginViewController:self didLoginUserWithEmail:email andPassword:password];
    }];
}

更新

我尝试按照此处parameterEncoding的建议更改,但没有解决问题。

第二次更新

这是访问 POST 数据的服务器端的 PHP 代码。这是由我的一位同事编写的,因为我在服务器端不做任何事情,并且非常不熟悉它的工作原理。

header('Content-type: application/json');
$username = $_POST['uname'];
$pw = $_POST['pw'];

服务器代码非常简单。他有某种日志脚本来检查变量值是什么,他说客户端正在访问服务器,但变量值是空白的。

第三次更新

这是通过生成变量print_r的HTTP 请求的转储:$_REQUEST

Array ( [sid] => FwAqvZrfckw )

这是$_POST变量的转储。如您所见,它完全是空白的:

Array ( )

第四次更新

在将数据包发送到服务器之前,我使用Wireshark捕获了数据包,一切似乎都井然有序:

Accept: application/json
Content-Type: application/x-www-form-urlencoded; charset=utf-8

POST参数也都在那里。我们还在服务器端创建了一个测试文件,并且只是做了一个测试POST以确保那里的代码可以正常工作,而且确实如此。

4

2 回答 2

6

谢谢你。

遇到同样的问题,我需要使用 AFFormURLParameterEncoding。

因此,为了简化所有线程,您必须使用: [[APIClient sharedClient] setParameterEncoding:AFFormURLParameterEncoding];

于 2012-11-07T13:51:47.713 回答
0

我没有看到任何特别会在这里引起问题的东西,但我将首先为您提供我用来解决类似问题的步骤。

首先,检查工具 Charles,它是一个调试 Web 代理,它将拦截来自服务器的响应,并且应该让您更清楚地了解发生了什么问题。有 30 天的免费试用期,它确实帮助我找出了小错误。要使用它,请按顺序按钮并通过您的服务器 url 过滤结果。从那里您可以看到从服务器发送和接收的请求和响应。如果以下内容不能解决您的问题,请发布 Charles 吐出的请求和响应。

明智地修复,尝试[[APIClient sharedClient] setParameterEncoding:AFJSONParameterEncoding]在发送 POST 请求之前添加。看起来你们都在使用 JSON 作为服务器端格式。

所以在 loginUsingEmail 中:

self.email = email;
self.password = password;

[[APIClient sharedClient] setParameterEncoding:AFJSONParameterEncoding];

[[APIClient sharedClient] postPath:@"insert path here" parameters:[NSDictionary dictionaryWithObjectsAndKeys:email, @"uname", password, @"pw", nil] success:^(AFHTTPRequestOperation *operation, id responseJSON) {
    if (block) {
        block(responseJSON);
    }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);

    if (block) {
        block(nil);
    }
}];

// Store user data in app?
}
于 2012-07-06T00:39:27.433 回答