Всем привет, продолжаем говорить про RestServer, построенный на одном из лучших языков программирования Delphi.
Встала такая задача – получать баланс с сервиса SMSC.ru
Стандартный ответ сервера выглядит примерно так…
1 |
{"result":["200 , OK"]} |
Причем 200,OK это результат функции, которая отработала на сервере по запросу. И этот результат типа string. Заказчик же попросил сделать что-то в духе…
1 |
{ "Result":"200", "Balance":"3200.00"} |
Прочитав мануал MarcoCantu, на 39-40 страницах, раздел RETURNING JSON O BJECTS AND VALUES, я пришел к выводу, что результатом функции должен быть JSON Object, немного поэкспериментировав, у меня получилось следующее
1 |
{"result":[{"serverAnswer":"200,OK","balance":"500.11"}]} |
Ok, это уже интересно, правда? Выходит мы можем обмениваться любыми объектами таким образом. Вот часть кода моей программы, которая запрашивает баланс
В браузере запрашиваем
1 |
http://localhost:8080/smsAPI/v1/TSMSMethods/getBalance/ AcheckToken |
Внутри программы отрабатывает такая функция
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
function TRestServerSMS.GetBalance(aServerAnswerOK, aServerAnswerOK_DescriptionRUS: string): TJSONObject; var smsCore: ISMSCCore; Programs: TRestServerPrograms; id: integer; balance: string; jo: TJSONObject; jp: TJsonPair; jp2: TJsonPair; serverAnswer: string; begin smsCore := TRestServerSmsc.Create; try balance := smsCore.GetBalance; finally smsCore.Free(); end; //get id with qSelectSMSCID do begin Connection := DBConnection.FDConnection; Disconnect(); Open(); id := FieldByName('id').AsInteger; Close(); end; //update DB with qUpdateBalance do begin Connection := DBConnection.FDConnection; Params.ParamValues['balance'] := balance; Params.ParamValues['id'] := id; ExecSQL; end; //creating json object jo := TJSONObject.Create; jp := TJsonPair.Create('serverAnswer', aServerAnswerOK + ',' + aServerAnswerOK_DescriptionRUS); jp2 := TJsonPair.Create('balance', balance); jo.AddPair(jp); jo.AddPair(jp2); Result := jo; end; |