2016-10-27 14 views
0

У меня проблема с моим запросом JSON-RPC.Objective-C Проблема с запросом JSON-RPC

NSString *jsonString = @"{id:1,method:getHolidays,jsonrpc:2.0}"; 
NSString *requestString = [NSString stringWithFormat:@"%@",jsonString,nil]; 

NSData *requestData = [NSData dataWithBytes: [jsonString UTF8String] length: [requestString length]]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:@"https://neilo.webuntis.com/WebUntis/jsonrpc.do?school=htl_v%C3%B6cklabruck"]]; 

[request setHTTPMethod: @"POST"]; 
[request setValue:@"Content-type: application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:requestData]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil ]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding]; 

NSLog(@"\n\n\noutput: %@",returnString); 

Как результат я получаю этот выход:

{"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"Parse error: Unexpected character ('i' (code 105)): was expecting double-quote to start field name\n at [Source: [email protected]; line: 1, column: 3]"}}

Результат должен быть: ->message = not-authenticated < -

Кто-нибудь есть идея, что проблема есть?

+0

'NSDictionary * jsonDict = @ {@ "ID": @ 1, @ "метод": "@ getHolidays", @ "jsonrpc": @ "2,0"}; NSData * jsonData = [NSJSONSerialization dataWithJSONObject: jsonDict options: 0 error: & error]; '...' [request setHTTPBody: jsonData]; 'Если вы скопируете/вставьте строку JSON в JSON Validator, вы увидите, что это недействительно (отсутствует цитата, окружающая строки). Это должно быть '{" id ": 1," method ":" getHolidays "," jsonrpc ": 2.0}', что 'NSJSONSerialization' позаботится об этом и упростит, так как оно построено из словаря (проще изменить параметр). – Larme

+0

Да Получил! NSString * jsonString = @ "{\" id \ ": \" 1 \ ", \" method \ ": \" getHolidays \ ", \" jsonrpc \ ": \" 2.0 \ "}"; – Darkdrummer

+0

Я бы рекомендовал использовать 'NSJSONSerialization' вместо того, чтобы самостоятельно создавать JSON String. Это безопаснее (есть параметр ошибки, если он недопустим, его легче модифицировать, особенно с изменяемым NSMutableArray/Dictionary, если есть ключ, который можно добавить или нет). Кроме того, избегайте 'sendSynchronousRequest: returnResponse: error:', предпочитает async (с 'NSURLSession'). – Larme

ответ

0

was expecting double-quote to start field name:

Ваш сервер сообщает вам, что ваш JSON недействителен.

Если вы проверите {id:1,method:getHolidays,jsonrpc:2.0} на валидаторе JSON (например, http://jsonlint.com/), это скажет вам об этом. Как уже было сказано, для каждой строки (ключей/значений) отсутствуют кавычки: {"id": 1,"method": "getHolidays","jsonrpc": 2.0}.

Итак, как вы пробовали @"{\"id\":\"1\",\"method\":\"getHolidays\",\"jsonrpc\":\"2.0‌​\"}" работ.

Я бы рекомендовал использовать NSJSONSerialization, образец не тестируется (не компилировать):

NSDictionary *jsonDict = @{@"id":@1, 
          @"method":@"getHolidays", 
          @"jsonrpc":@"2.0"}; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:&error]; 
... 
[request setHTTPBody:jsonData]; 

Вам не придется бежать " (как \"), если есть условия по вашим параметрам, допустим, if(someReason){doNotPutmethodKeyInJSON}, с NSMutableDictionary, это проще, а также легче читать (особенно ваша новая строка со всем \" затрудняет чтение, где может быть проблема) Кроме того, в случае недействительного JSON вы можете прочитать error.

Я не знаю, где вы положили этот код, но если это основной поток, который будет блокировать пользовательский интерфейс, поэтому следует избегать sendSynchronousRequest:returningResponse:error:, предпочитают асинхронных вызовов (с помощью NSURLSession)

+0

Спасибо за быстрый ответ, но я действительно не понял, что вы имеете в виду с сеансом NSURL. – Darkdrummer

+0

Это класс, который обрабатывает веб-вызовы асинхронно. Есть учебник об этом, doc и т. Д. – Larme