PHP 脚本未从 NSURLSession 接收 POST 数据


PHP script not receiving POST data from NSURLSession

我正在尝试从我的iOS应用程序向服务器中的PHP脚本发出HTTP请求,发送POST数据。Objective-C代码如下:

            NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
            NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:nil];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.mywebsite.com/script.php"]
                                                                   cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                               timeoutInterval:60.0];
            [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
            [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
            [request setHTTPMethod:@"POST"];
            NSMutableDictionary *info = [NSMutableDictionary dictionary];
            [info setObject:[NSNumber numberWithInt:5] forKey:@"FIRST"];
            [info setObject:[NSNumber numberWithInt:3] forKey:@"SECOND"];
            NSData *data = [NSJSONSerialization dataWithJSONObject:info options:0 error:&error];
            [request setHTTPBody:data];
            NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                NSLog(@"I GOT THE ANSWER: %@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
            }];
            [postDataTask resume];

这是PHP脚本:

<?php
$first  = intval($_POST["FIRST"]);
$second = intval($_POST["SECOND"]);
$result = $first + $second;
echo("= " . $result);
?>

iOS 应用输出

我得到了答案:= 0

这是不正确的。我不确定问题是什么。

我的代码基于这个解决方案:https://stackoverflow.com/a/19101084/555690。在同一个问题中,提问者还发布了另一个不使用NSDictionary的解决方案,这对我有用,但我不明白为什么这个特定的解决方案不起作用。

所以你必须用 NSUTF8StringEncoding 对字符串进行编码。

根据我的经验,最简单/最好的方法是改用"post string",以便您可以对其进行编码。

另外,您想在其中添加NSError *error = nil;或类似的东西。此外,您可能希望将其添加到主委托队列中,以便可以使用其委托来处理它。

这是一个例子(我测试了它):

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:[NSOperationQueue mainQueue]];
NSURL *url = [NSURL URLWithString:@"http://localhost:8888/Untitled.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *params =@"FIRST=1&SECOND=2";
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSessionDataTask * dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSLog(@"Data = %@", [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]);
}];
[dataTask resume];

我还建议在文件顶部使用session_start();

希望这有帮助!