powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как из TIdHTTPServer принять POST данные в виде JSON?
12 сообщений из 12, страница 1 из 1
Как из TIdHTTPServer принять POST данные в виде JSON?
    #40090731
AnWa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени, прошу помощи разобраться с работой 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
Как из TIdHTTPServer принять POST данные в виде JSON?
    #40090813
AnWa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема оказалась в начальной скобке: { - то объект. [ - массив. Помог разобраться следующий пример:

Код: 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
Как из TIdHTTPServer принять POST данные в виде JSON?
    #40090906
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как из TIdHTTPServer принять POST данные в виде JSON?
    #40090972
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
она же вроде заброшена?
...
Рейтинг: 0 / 0
Как из TIdHTTPServer принять POST данные в виде JSON?
    #40091009
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,

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

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

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

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

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

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

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


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