所以我看了很多类似的问题,但没有人回答我正在寻找或完整的答案,所以希望你们都能帮助我.
我需要使用POST将appID的数组从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];
Run Code Online (Sandbox Code Playgroud)
所以,从这一端开始,我已经检查了所有内容并且看起来都很好,但是从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);
Run Code Online (Sandbox Code Playgroud)
最后,我做错了什么?为什么我的PHP端没有收到任何内容.最重要的是,有人可以向我解释如何通过POST发送数组.因为我觉得这是我真正的问题所在,我不太了解它自己解决问题.我不明白你如何从iOS端把所有东西都放进来并在PHP端拿起它.
我希望所有这些都足够清楚,先谢谢.
编辑:
我尝试通过URL将数组作为字符串传递然后爆炸它,幸运的是它工作...但我只是在URL限制,所以我仍然想找到另一个解决方案.至少,现在我知道我的其余代码按预期工作了.
您似乎对如何$_POST填充变量有一个基本的误解.将文档类型指定为JSON并将JSON字符串作为post主体抛出将不会自动填充此数组.身体必须采用特定的格式.通常,这意味着url编码对,例如a=1&b=2&c=2&d=%2fg+y等.这在某种程度上限制了您可以发送的数据类型.特别是,如果您希望它自动显示在$ _POST变量中,则在这种意义上不可能使用任意JSON对象.这里有几个选项:
方案一:不使用$_POST,直接使用帖子体.使用fopen("php://input")PHP JSON解析器来解析它:
$input = file_get_contents("php://input");
$obj = json_decode($input,true);
$restIDs = $obj['restIDs'];
Run Code Online (Sandbox Code Playgroud)
如果你走这条路线,你不需要创建一个带有名字的对象restIDs.您可以简单地序列化数组并使用$objas$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];
Run Code Online (Sandbox Code Playgroud)
现在,您应该可以使用$_POST['restIDs']您期望的方式访问它.