2013-06-17 4 views
0

У меня есть проект 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 в зависимости от того, «кто» запрашивает информацию.

ответ

0

Похоже, что вы используете категорию для получения данных в формате JSON для отправки на сервер в этих двух строк кода:

// 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]]; 

Попробуйте заменить его с NSJSONSerialization и посмотреть, если это делает разницу , По крайней мере, вы избавитесь от необходимости конвертировать его в NSString. Может быть, категория делает что-то фанки.

NSData* requestData = [NSJSONSerialization dataWithJSONObject:postDictionary options:NSJSONWritingPrettyPrinted error:&error]; 

Если вы хотите, чтобы увидеть, если он генерируя правильный JSON вы можете распечатать его с помощью:

NSLog(@"%@", [[NSString alloc] initWithData:requestData encoding:NSUTF8StringEncoding]); 
+0

Спасибо большое. Как только я вернусь домой, я попробую, что вы скажете. Тем не менее, я не думаю, что проблема заключается в генерации json-строки, поскольку она отлично работает (даже сложные связанные словари и массивы). И, по сути, я уже пробовал с другими методами сериализации. Я скажу вам как можно скорее. – ElPiter

+0

Да. Определенно, после повторного чтения, я сделал это вчера и не получил ничего другого. Во всяком случае, я попробую, как только я вернусь домой, но я не очень надеюсь на это :(Спасибо большое снова! :) – ElPiter

+0

Подтверждено. Однажды дома я попробовал то, что вы сказали, и данные продолжают получать сервер и запрос в тексте простого json без преобразования в структуры PHP. Я начинаю думать, что это правильный путь, и я обязан использовать функцию json_decode – ElPiter

Смежные вопросы