7

因此,我浏览了无数类似的问题,但没有一个回答我正在寻找的内容或以完整的方式回答它,所以希望大家能帮助我。

我需要使用 POST 将一系列餐厅 ID 从 iOS 传递到 PHP 文件,或者无论如何都可以正常工作。我知道 ASIHTTPRequest 但我正在寻找内置的东西,它已被开发人员放弃。最后,我不想通过 URL 传递它们,因为我不知道会有多少条目。

所以这就是我到目前为止所得到的。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:theURL]];

[request setHTTPMethod:@"POST"];

NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init];
[jsonDict setValue:restaurants forKey:@"restIDs"];
NSLog(@"JSON Dict: %@",jsonDict);//Checking my array here


NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:kNilOptions error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"JSON String: %@",jsonString); //Checking my jsonString here...

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[request setValue:@"json" forHTTPHeaderField:@"Data-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: jsonData];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"Return DATA contains: %@", [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil]);
NSArray *restMenuCount = [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil];

因此,从这一端开始,我检查了一切,一切看起来都很好,但从 PHP 端它甚至没有捡起它。

这是我的 PHP 文件的样子:

$restIDs = $_POST['restIDs'];
echo $restIDs; //Checking to see if it even has anything......but nothing there
for ($i = 0; $i < $restIDs.count; $i++) {
    $query = "SELECT * FROM `MenuItems` WHERE rest_id = '$restID'";
    $result = mysqli_query($connect, $query);
    $number = mysqli_num_rows($result);
    $menuNumber[$i] = $number;
}

echo json_encode($menuNumber);

所以最后,我做错了什么?为什么我的 PHP 端没有收到任何东西。最重要的是,有人可以向我解释如何通过 POST 发送数组。因为我觉得这是我真正的问题,所以我对它的理解不足以自己解决问题。我不明白您如何将所有内容从 iOS 端放入并在 PHP 端提取。

我希望所有这些都足够清楚,在此先感谢。

编辑:
我尝试通过 URL 将数组作为字符串传递,然后将其分解,幸运的是它起作用了......但我只是在 URL 限制之下,所以我仍然想找出另一个解决方案。至少,现在我知道我的其余代码按预期工作。

4

2 回答 2

8

您似乎对如何$_POST填充变量有一个基本的误解。将文档类型指定为 JSON 并将 JSON 字符串作为帖子正文放入将不会自动填充此数组。正文必须采用特定格式。通常,这意味着 url 编码的对,例如a=1&b=2&c=2&d=%2fg+y等。这在一定程度上限制了您可以发送的数据类型。特别是,如果您希望它自动显示在 $_POST 变量中,那么从这个意义上说,任意 JSON 对象是不可能的。这里有几个选项:

$_POST选项一:直接使用帖子正文,而不是使用。使用 PHP JSON 解析器使用fopen("php://input")和解析它:

$input = file_get_contents("php://input");
$obj = json_decode($input,true);
$restIDs = $obj['restIDs'];

如果你走这条路,你不需要创建一个带有一个名为的字段的对象restIDs。您可以改为简单地序列化数组并$obj用作$restIDs

选项二,假设您在 restIDs 中的对象只是字符串,而不是将数据作为 JSON 对象传递,请按照 PHP 使用的方式格式化正文:

NSMutableString *bodyStr = [NSMutableString string];
for (NSString *restID in restaurants) {
    [bodyStr appendFormat:@"restIDs[]=%@&",[restID stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody: body];

现在您应该可以$_POST['restIDs']按照您的预期使用它了。

于 2012-12-03T04:21:16.650 回答
1

您传递的数组错误。首先你把它放在一个 JSON 字符串中,然后你没有把 JSON 字符串放在 post 变量中,而是作为 HTML 消息的正文。如果要使用 JSON 通过 POST 消息将数据传输到 PHP,则需要将其设置为 post 变量。然后在 PHP 中,读取变量并解码 json 以获得原始变量。这是我如何做到的一个例子。

抱歉,我最初在这里粘贴了 Java 代码。这可能更有意义。

-(void) setPath: (NSString *) input
{
    Path=input;
}

-(void) run
{
    NSDictionary* jsonDictionary=[NSDictionary dictionaryWithObject: data1 forKey:@"data"];
    NSString* jsonString = [jsonDictionary JSONRepresentation];
    AFHTTPClient *httpClient=[[AFHTTPClient alloc] initWithBaseURL:url];
    NSDictionary *params =[NSDictionary dictionaryWithObjectsAndKeys:
                           apps,@"app",
                           jsonString,@"smpdata",nil];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:Path parameters:params];

    NSURLResponse *response = nil;
    NSError *error = nil;

    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if (error) {
        NSLog(@"Error: %@",error);
    }
    else {
        id JSON = AFJSONDecode(data, &error);
        NSArray *dataarray=[JSON valueForKey:@"Data"];
        status= [NSString stringWithFormat:@"%@",[JSON valueForKeyPath:@"Status"]];
        NSLog(@"%@",status);
        returndata= dataarray;

    }
}

-(NSArray *) returndata {
    return returndata;
}

-(NSString *) status {
    return status;
}

@end

PHP

<?
$jsondata=$_POST['smpdata'];
$data = json_decode($jsondata);
?>
于 2012-12-03T04:26:15.843 回答