Использование POST для .php
EDIT. Я редактировал OP со всеми предложениями, которые я получил от людей, поэтому это последнее (и его все еще не работает).
У меня есть следующий код, который должен POST некоторые данные в .php файл, который у меня есть (а затем в базу данных, но это выходит за рамки этого вопроса).
В мой метод передаю массив, содержащий некоторые строки.
-(void)JSON:(NSArray *)arrayData {
//parse out the json data
NSError *error;
//convert array object to data
NSData* JSONData = [NSJSONSerialization dataWithJSONObject:arrayData
options:NSJSONWritingPrettyPrinted
error:&error];
NSString *JSONString = [[NSString alloc] initWithData:JSONData
encoding:NSUTF8StringEncoding];
NSString *URLString = [NSString stringWithFormat:@"websitename"];
NSURL *URL = [NSURL URLWithString:URLString];
NSLog(@"URL: %@", URL);
NSMutableURLRequest *URLRequest = [NSMutableURLRequest requestWithURL:URL
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
NSData *requestData = [NSData dataWithBytes:[JSONString UTF8String] length:[JSONString length]];
NSString *requestDataString = [[NSString alloc] initWithData:requestData
encoding:NSUTF8StringEncoding];
NSLog(@"requestData: %@", requestDataString);
[URLRequest setHTTPMethod:@"POST"];
NSLog(@"method: %@", URLRequest.HTTPMethod);
[URLRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[URLRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[URLRequest setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[URLRequest setHTTPBody: requestData];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:URLRequest delegate:self];
if (connection) {
NSMutableData *receivedData = [[NSMutableData data] retain];
NSString *receivedDataString = [[NSString alloc] initWithData:receivedData
encoding:NSUTF8StringEncoding];
NSLog(@"receivedData: %@", receivedDataString);
}
//potential response
NSData *response = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:nil error:nil];
//convert response so that it can be LOG'd
NSString *returnString = [[NSString alloc] initWithData:response encoding:NSASCIIStringEncoding];
NSLog(@"RETURN STRING: %@", returnString);
}
ПРИМЕЧАНИЕ. У меня есть фактический URL моего сайта в коде, чтобы каждый мог проверить, хотят ли они.
Тогда есть сторона .php вещей, где все, что я пытаюсь сделать, это искать любой вход вообще (но я ничего не получаю).
<html>
<body>
<?php
echo "Connection from iOS app to MySQL database<BR>";
echo '<pre>'.print_r($GLOBALS,true).'</pre>';
?>
</body>
</html>
Все, что я действительно пытаюсь сделать прямо сейчас, - это подтверждение того, что данные проходят через, повторяя его на странице, а затем просматривая страницу из моего приложения (пока данные не показываются).
Выходной файл .php:
<html>
<body>
Connection from iOS app to MySQL database<BR>'Array
(
)
'<pre>Array
(
[_GET] => Array
(
)
[_POST] => Array
(
)
[_COOKIE] => Array
(
)
[_FILES] => Array
(
)
[GLOBALS] => Array
*RECURSION*
)
</pre> </body>
</html>
Ответы
Ответ 1
Я понятия не имею о Objective-C, при условии, что вы пытаетесь отправить следующие данные JSON (т.е. JSONString является следующим):
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
тогда ваш запрос должен выглядеть примерно так:
POST /yourwebsite.php HTTP/1.1
Host: cs.dal.ca
User-Agent: USER-AGENT
Accept: text/html,application/json,*/*
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 624
data=%7B%0A++++%22firstName%22%3A+%22John%22%2C%0A++++%22lastName%22%3A+%22Smith%22%2C%0A++++%22age%22%3A+25%2C%0A++++%22address%22%3A+%7B%0A++++++++%22streetAddress%22%3A+%2221+2nd+Street%22%2C%0A++++++++%22city%22%3A+%22New+York%22%2C%0A++++++++%22state%22%3A+%22NY%22%2C%0A++++++++%22postalCode%22%3A+%2210021%22%0A++++%7D%2C%0A++++%22phoneNumber%22%3A+%5B%0A++++++++%7B%0A++++++++++++%22type%22%3A+%22home%22%2C%0A++++++++++++%22number%22%3A+%22212+555-1234%22%0A++++++++%7D%2C%0A++++++++%7B%0A++++++++++++%22type%22%3A+%22fax%22%2C%0A++++++++++++%22number%22%3A+%22646+555-4567%22%0A++++++++%7D%0A++++%5D%0A%7D%0A%0A%0A
обратите внимание, что Content-Type: application/json
НЕ способ публикации данных, как вы уже использовали, и обратите внимание, что данные были ур-кодированы, это не должно быть сложно, я нашел эту ссылку о том, чтобы делать поэтому в Objective-C: URLEncoding строка с Objective-C
Отправляя запрос выше, я получил следующее:
php code:
<?php
$raw_json_data = $_POST['data'];
$json_data = json_decode($raw_json_data);
print_r($json_data);
результат:
stdClass Object
(
[firstName] => John
[lastName] => Smith
[age] => 25
[address] => stdClass Object
(
[streetAddress] => 21 2nd Street
[city] => New York
[state] => NY
[postalCode] => 10021
)
[phoneNumber] => Array
(
[0] => stdClass Object
(
[type] => home
[number] => 212 555-1234
)
[1] => stdClass Object
(
[type] => fax
[number] => 646 555-4567
)
)
)
что вам нужно!
ПРИМЕЧАНИЕ. Я должен упомянуть, что ваш script в http://yourwebsite.php работает неправильно, я не мог даже представить нормальную форму! Возможно, возникла проблема с неправильной конфигурацией сервера или чем-то подобным, но с использованием Apache 2.2 и PHP 5.4.4 и кодов, упомянутых выше, я получил его работу!
Ответ 2
Вы используете POSTING JSON вместо application/x-www-form-urlencoded
.
PHP $_POST
заполняется только для application/x-www-form-urlencoded
-requests. Если вы отправляете json прямо так, то вам следует:
<?php
$posted_json = json_decode(file_get_contents("php://input"));
print_r($posted_json);
Обратите внимание, что если json недействителен, это не сработает. Вы всегда можете отлаживать тело запроса с помощью:
<?php
echo file_get_contents("php://input");
Здесь общее описание $_POST и $_GET http://www.php.net/manual/en/language.variables.external.php:
Они предназначены для использования с нормальными форматами html, хотя вы можете легко эмулировать такие запросы с соответствующим заголовком кодировки и заголовком содержимого. Но они не будут работать с JSON, так как не работают нормальные html-формы.
Ответ 3
Вы принимаете поле HTTP-заголовка, установленное на application/json
. так что это тип содержимого. Возможно, вам захочется проверить, действительно ли данные, переданные между браузером и сервером, являются json. Вы также можете изменить его на text/plain
и проверить..