Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как из TIdHTTPServer принять POST данные в виде JSON? / 12 сообщений из 12, страница 1 из 1
14.08.2021, 13:45
    #40090731
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
Доброго времени, прошу помощи разобраться с работой c json, на данный момент получилось принять только данные в виде строки.
Строка следующего вида:
Код: pascal
1.
[{"param1":"1","user":"name1","pass":"pass1"}]


Хотелось бы иметь возможность получать данные из нее как из словаря.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  strStream: TStringStream;
  s: string;
begin
  if ARequestInfo.CommandType = hcPOST then
  begin
    strStream:= TStringStream.Create('',CP_UTF8);
    strStream.LoadFromStream(ARequestInfo.PostStream);
    s := strStream.Datastring;
    TThread.Queue(nil,
        procedure
        begin
          Memo1.Lines.Add(s);
        end
      );
    AResponseInfo.ResponseNo := 200;
  end
end;



Пробую так:
Код: pascal
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.
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  strStream: TStringStream;
  s: string;
  json: TJSONObject;

begin
  if ARequestInfo.CommandType = hcPOST then
  begin
    strStream:= TStringStream.Create('',CP_UTF8);
    strStream.LoadFromStream(ARequestInfo.PostStream);
    s := strStream.Datastring;
    json:= TJSONObject.Create;
    json:= TJSONObject.ParseJSONValue(s) as TJSONObject;
    if Assigned(json) then
      TThread.Queue(nil,
        procedure
        begin
          Memo1.Lines.Add(json.GetValue<string>('user'));
        end
      );
    AResponseInfo.ResponseNo := 200;
  end
end;
...
Рейтинг: 0 / 0
15.08.2021, 06:46
    #40090813
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
Проблема оказалась в начальной скобке: { - то объект. [ - массив. Помог разобраться следующий пример:

Код: pascal
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.
{$APPTYPE CONSOLE}
 
uses
  DBXJSON,
  System.SysUtils;
 
Const
StrJson =
  '['+
  '{"EventType":49,"Code":"234","EventDate":"20050202", "Result":1},'+
  '{"EventType":48,"Code":"0120","EventDate":"20130201", "Group":"g1"}'+
  ']';
 
 
procedure ParseJson;
var
  LJsonArr   : TJSONArray;
  LJsonValue : TJSONValue;
  LItem     : TJSONValue;
begin
   LJsonArr    := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StrJson),0) as TJSONArray;
   for LJsonValue in LJsonArr do
   begin
      for LItem in TJSONArray(LJsonValue) do
        Writeln(Format('%s : %s',[TJSONPair(LItem).JsonString.Value, TJSONPair(LItem).JsonValue.Value]));
     Writeln;
   end;
end;
 
begin
  try
    ParseJson;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
...
Рейтинг: 0 / 0
16.08.2021, 00:01
    #40090906
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
...
Рейтинг: 0 / 0
16.08.2021, 12:03
    #40090972
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
она же вроде заброшена?
...
Рейтинг: 0 / 0
16.08.2021, 13:43
    #40091009
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
энди,

Вроде 8 месяцев назад был апдейт, хотя я на эту тему не заморачиваюсь, ибо там все что надо работает.
...
Рейтинг: 0 / 0
16.08.2021, 20:07
    #40091101
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
я вроде пробовал на андроиде на 10.3 и оно не работало, переписал на стандартный модуль JSON
...
Рейтинг: 0 / 0
16.08.2021, 21:36
    #40091111
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
энди,

Странно.
Я под андроид сам не пробовал, но там же PurePascal и вроде ничего платформно-зависимого не используется.

С чего бы ему не работать?
...
Рейтинг: 0 / 0
17.08.2021, 08:48
    #40091134
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
врать не буду не помню, я сейчас пользуюсь связкой стандартный JSON модуль + генератор DTO https://jsontodelphi.com/
мне эта схема показалась довольно удобной, ничего лишнего и парсинг json в соответствующий класс одной строкой фактически
...
Рейтинг: 0 / 0
17.08.2021, 14:00
    #40091217
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
энди,

Мне стандартный синтаксисом не нравиться. Уж очень вербален и коряв.

А за ссылку спасибо.
...
Рейтинг: 0 / 0
22.08.2021, 08:21
    #40092470
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
У меня в System.JSON происходит утечка памяти, если я обращаюсь к несуществующему элементу в JSON. Возможно ли как то проверить наличие элемента в данных JSON?
...
Рейтинг: 0 / 0
22.08.2021, 10:18
    #40092480
AnWa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
AnWa
У меня в System.JSON происходит утечка памяти, если я обращаюсь к несуществующему элементу в JSON. Возможно ли как то проверить наличие элемента в данных JSON?

Проверил, XSuperObject тоже есть утечка, как освобождать XSuperObject?
...
Рейтинг: 0 / 0
22.08.2021, 16:11
    #40092513
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из TIdHTTPServer принять POST данные в виде JSON?
AnWa,

Поставь MadExcept или EurekaLog, найди место утечки, и либо исправь либо обойди.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как из TIdHTTPServer принять POST данные в виде JSON? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]