У меня есть проект Objective C, из которого мне нужно отправить данные JSON на php-сервер Symfony2.Цель C отправить JSON на сервер Symfony2
Это очень нормально, и я прочитал много документов и предыдущих выпусков в Stackoverflow, и я думаю, что мой код верен. Но по какой-то причине я не получаю данные на сервере, как мне кажется.
Позвольте мне показать вам две различные версии кода и последствий (в обоих примерах NSMutableURLRequest *request
переменная предположительно хорошо объявлена:
После установки всех HTTP заголовок, я делаю это:
NSString *postString = [NSString stringWithFormat:@"hist_id=%d", 10];
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
И как только отправляется на сервер, полное значение запроса имеет следующее:
POST /~pgbonino/Symfony/web/app.php/api/apiGetQuestions HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-us
Connection: keep-alive
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=8915n9cj4ak8fjna4emvnrsov5
Host: 127.0.0.1
Surrogate-Capability: symfony2="ESI/1.0"
User-Agent: PreparaTest/1.0 CFNetwork/609.1.4 Darwin/12.4.0
X-Php-Ob-Level: 1
hist_id=10 [] [] // <-- TAKE A LOOK AT THE BODY CONTENT
И если я в PHP $hist_id = $this->getRequest()->get('hist_id')
Я правильно достал 10.
Все идеально!
Но что, если мне нужно отправить на сервер более сложный набор данных. Например, NSDictionary с, например, некоторым массивом среди его значений. В этом случае лучше использовать JSON, да?
Это код и следствие для этого второго случая. Обратите внимание, что в этом втором примере я не буду использовать словари и массивы, а просто простой словарь с таким же значением «hist_id». Поэтому мы можем распараллелить оба примера.
// Create an array with a dictionary with a unique "hist_id" value set to 10
// (just like before, but using a dictionary and converting it to JSON.
NSDictionary *postDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithFormat:@"%d", 10], @"hist_id",
nil];
// Convert it to json string
NSString *json = [postDictionary JSONRepresentation]; // This is perfectly performed!
// Convert to NSData the json with the dictionary
NSData *requestData = [NSData dataWithBytes:[json UTF8String] length:[json length]];
// Set headers and the body to the request
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: requestData];
После отправки на сервер, к несчастью, я не получаю propperly запрос на стороне сервера:
POST /~pgbonino/Symfony/web/app.php/api/saveTest HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Accept-Language: en-us
Connection: keep-alive
Content-Length: 15
Content-Type: application/json
Cookie: PHPSESSID=caihkf98lh8injmdju512fvbc7
Host: 127.0.0.1
Surrogate-Capability: symfony2="ESI/1.0"
User-Agent: PreparaTest/1.0 CFNetwork/609.1.4 Darwin/12.4.0
X-Php-Ob-Level: 1
{"hist_id":"10"} [] [] // <-- TAKE A LOOK AT THE BODY CONTENT AND COMPARE WITH THE ABOVE EXAMPLE!!
По-видимому, это все в порядке, но когда я иду $this->getRequest()->get('hist_id')
, я не получить любую ценность.
Единственное, что я могу сделать, чтобы получить содержимое является:
$content = json_decode($request->getContent());
$hist_id = $content->{'hist_id'};
Является ли это правильный подход? Разве нет возможности получить значение «hist_id», просто делая $this->getRequest()->get('hist_id');
при отправке всего через JSON? Хорошо, я могу работать с json_decode, но я бы предпочел не использовать его, поскольку мое приложение должно быть многоканальным, и когда я отправляю данные из Интернета (JQuery.post), содержимое автоматически преобразуется в структуры данных php , Я бы не хотел использовать другой код для API в зависимости от того, «кто» запрашивает информацию.
Спасибо большое. Как только я вернусь домой, я попробую, что вы скажете. Тем не менее, я не думаю, что проблема заключается в генерации json-строки, поскольку она отлично работает (даже сложные связанные словари и массивы). И, по сути, я уже пробовал с другими методами сериализации. Я скажу вам как можно скорее. – ElPiter
Да. Определенно, после повторного чтения, я сделал это вчера и не получил ничего другого. Во всяком случае, я попробую, как только я вернусь домой, но я не очень надеюсь на это :(Спасибо большое снова! :) – ElPiter
Подтверждено. Однажды дома я попробовал то, что вы сказали, и данные продолжают получать сервер и запрос в тексте простого json без преобразования в структуры PHP. Я начинаю думать, что это правильный путь, и я обязан использовать функцию json_decode – ElPiter