我正在尝试使用 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
登录大脑中的登录方法
- (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?
}
Login 在 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
,但它没有解决问题。
第二次更新
这是来自服务器端的 PHP 代码,用于访问 POST 数据。这是由我的一位同事写的,因为我在服务器端什么都不做,而且对它的工作原理非常陌生。
header('Content-type: application/json');
$username = $_POST['uname'];
$pw = $_POST['pw'];
服务器代码非常简单。他有某种日志脚本来检查变量值是什么,他说客户端正在访问服务器,但变量值是空白的。
第三次更新
这是通过生成$_REQUEST
变量的print_r
来转储 HTTP 请求:
Array ( [sid] => FwAqvZrfckw )
这是$_POST
变量的转储。如您所见,它完全是空白的:
Array ( )
第四次更新
我使用Wireshark在数据包发送到服务器之前捕获数据包,一切似乎都井井有条:
Accept: application/json
Content-Type: application/x-www-form-urlencoded; charset=utf-8
POST
参数也都在那里。我们还在服务器端创建了一个测试文件,并做了一个测试POST
,以确保那里的代码正常工作,而且确实如此。
谢谢。
对于同样的问题,使用AFFormURLParameterEncode是我需要的。
所以为了简化所有线程,你必须使用: [[APIClient sharedClient] setParameterEncoding:AFFormURLParameterEncoding];
我没有看到任何特别会导致这里出现问题的东西,但我首先会给你我用来解决类似问题的步骤。
首先,请查看工具Charles,这是一个调试Web代理,它将拦截来自服务器的响应,并应使您更清楚地了解出了什么问题。有30天的免费试用期,它真的帮助我挑选了小错误。要使用它,请按序列按钮并通过您的服务器 url 过滤结果。从那里您可以看到从服务器发送和接收的请求和响应。如果以下内容无法解决您的问题,请发布 Charles 吐出的请求和响应。
明智地修复,尝试在发送 POST 请求之前添加[[APIClient sharedClient] setParameterEncoding:AFJSONParameterEncoding]
。看起来你们正在使用JSON作为服务器端格式。
所以在登录使用电子邮件:
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?
}