powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Json-запрос для получения ответа от сервера
19 сообщений из 19, страница 1 из 1
Json-запрос для получения ответа от сервера
    #39474832
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, с Json работаю впервые.
Имеется вопрос.
Накидал код для получения ответа, однако в ответ приходит пустой массив, а должен быть с полями и значениями.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TForm1.Button1Click(Sender: TObject);
var
  PostData: TStringList;
  ResponseBody: string;
begin
  try
    PostData := TStringList.Create;
    PostData.Clear;
    PostData.Add(Utf8Encode('{"name": "никольское"}'));
    IdHTTP1.Request.ContentType := 'application/json';
    IdHTTP1.Request.Accept := 'application/json';
    IdHTTP1.Request.ContentEncoding := 'utf-8';
    ResponseBody := IdHTTP1.Post(
      'http://10.231.201.200/SstuRf/PublicApi/HandlingReport/SearchDepartments'
        , PostData);
    ShowMessage(IdHTTP1.ResponseText);
    ShowMessage(ResponseBody);
  finally
    PostData.Free;
  end;
end;



Хотя ответ от сервера имеет статус - HTTP/1.1 200 OK

Как понять в чем дело ?

Есть ли ПО для альтернативного получения? Чтобы хотя бы проверить что оно возвращает ?
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39474852
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Связаться с разработчиками сервиса и узнать детали работы с ним. Из возможных косяков -- запрос идет почему-то через POST, хотя обычно такие вещи (чтение данных) как раз через GET делаются. Плюс, если это поиск, может надо еще какие настройки указывать (% в начале-конце поисковой строки) или там чуствителен к регистру он и тупо не находит никаких записей (мы ищем с маленькой буквы, а в базе он с большой).
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39474953
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

wsnetв ответ приходит пустой массивВероятнее всего сам запрос верный, но сервер не может найти такое значение. Варианты:
Его нет

Поиск регистрозависимый

Косяк с кодировкой запроса

Косяков много. На сколько они фатальны - вопрос
wsnet
Код: pascal
1.
2.
  try
    PostData := TStringList.Create;

Создавать объекты нужно ДО try
wsnet
Код: pascal
1.
PostData.Clear;

Какой смысл очищать только-что созданный список?
wsnet
Код: pascal
1.
PostData.Add(Utf8Encode('{"name": "никольское"}'));

А вот здесь уже серьезно. Если делфи юникодная, то в стринглист покладется строка в UTF-16. Как ее отправит инди - вопрос. Чтобы не заморачиваться с кодировками, пишите сразу в TStream и именно этот стрим отдавайте инди
wsnetКак понять в чем дело ?Для начала смотреть в сниффере, что уходит на сервер
wsnetЧтобы хотя бы проверить что оно возвращает ?В том же сниффере можно посмотреть и ответ
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475173
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_wsnet,

wsnetв ответ приходит пустой массивВероятнее всего сам запрос верный, но сервер не может найти такое значение. Варианты:
Его нет

Поиск регистрозависимый

Косяк с кодировкой запроса

Косяков много. На сколько они фатальны - вопрос
wsnet
Код: pascal
1.
2.
  try
    PostData := TStringList.Create;

Создавать объекты нужно ДО try
wsnet
Код: pascal
1.
PostData.Clear;

Какой смысл очищать только-что созданный список?
wsnet
Код: pascal
1.
PostData.Add(Utf8Encode('{"name": "никольское"}'));

А вот здесь уже серьезно. Если делфи юникодная, то в стринглист покладется строка в UTF-16. Как ее отправит инди - вопрос. Чтобы не заморачиваться с кодировками, пишите сразу в TStream и именно этот стрим отдавайте инди
wsnetКак понять в чем дело ?Для начала смотреть в сниффере, что уходит на сервер
wsnetЧтобы хотя бы проверить что оно возвращает ?В том же сниффере можно посмотреть и ответ


Vasilisk_ в точку! Огромное спасибо, после записи в Stream все получилось!
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TForm1.Button1Click(Sender: TObject);
var
  PostData: TStringStream;
  ResponseBody: string;
  Json: String;
begin
  Json := '{"name": "никольское"}';
  PostData := TStringStream.Create(Utf8Encode(Json));
  try
    IdHTTP1.Request.ContentType := 'application/json';
    IdHTTP1.Request.Accept := 'application/json';
    IdHTTP1.Request.ContentEncoding := 'utf-8';
    ResponseBody := IdHTTP1.Post(
      'http://10.231.201.200/SstuRf/PublicApi/HandlingReport/SearchDepartments'
        , PostData);
    ShowMessage(IdHTTP1.ResponseText);
    ShowMessage(ResponseBody);
  finally
    PostData.Free;
  end;
end;
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475401
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь не могу отправить json-запрос в видел файла на сервер.
Запрос должен иметь вид:
автор{
"departmentId": "3DB1BE3B-BED1-49F6-AB4C-D138A81A9505",
"isDirect": false,
"format": "Electronic",
"number": "А26-00-000000000",
"createDate": "2016-11-15",
"name": "Иванов Иван Иванович",
"address": "г. Калуга, ул. Циолковского, д.8",
"email": "user@hostname.com",
"questions": [
{
"code": "0001",
"status": "InWork",
"incomingDate": "2016-11-16",
"registrationDate": "2016-11-17"
}
]
}


Пишу обработчик:
Код: 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.
39.
40.
procedure TForm1.Button2Click(Sender: TObject);
var
  JSONObject: TJSONObject;
  JsonArray: TJSONArray;
  PostData: TStringStream;
begin
  JSONObject := TJSONObject.Create;
  PostData := TStringStream.Create;
  try
    JSONObject.AddPair('departmentId',
      TJSONString.Create('715db6d9-0988-4ab0-8546-5a7783b1b362'));
    JSONObject.AddPair('isDirect', TJSONTrue.Create);
    JSONObject.AddPair('format', TJSONString.Create('Electronic'));
    JSONObject.AddPair('number', TJSONString.Create('1622'));
    JSONObject.AddPair('createDate', TJSONString.Create('2016-11-15'));
    JSONObject.AddPair('name', TJSONString.Create('Иванов Иван Иванович'));
    JSONObject.AddPair('address', TJSONString.Create
        ('г.Калуга, ул. Рознина, д.72'));
    JSONObject.AddPair('email', TJSONString.Create('mail@yandex.ru'));
    JsonArray := TJSONArray.Create();
    JSONObject.AddPair('questions', JsonArray);
    JsonArray.AddElement(TJSONObject.Create(TJSONPair.Create('code',
          TJSONString.Create('0001'))));
    JsonArray.AddElement(TJSONObject.Create(TJSONPair.Create('status',
          TJSONString.Create('InWork'))));
    JsonArray.AddElement(TJSONObject.Create(TJSONPair.Create('incomingDate',
          TJSONString.Create('2016-11-16'))));
    JsonArray.AddElement(TJSONObject.Create(TJSONPair.Create
          ('registrationDate', TJSONString.Create('2016-11-17'))));

    PostData.WriteString(JSONObject.ToString);

    PostData.SaveToFile('1.json');

  finally
    PostData.Free;
    JSONObject.Free;
  end;

end;



Получаю json-файл:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
{
	"departmentId": "715db6d9-0988-4ab0-8546-5a7783b1b362",
	"isDirect": true,
	"format": "Electronic",
	"number": "1622",
	"createDate": "2016-11-15",
	"name": "Иванов Иван Иванович",
	"address": "г.Калуга, ул. Рознина, д.72",
	"email": "mail@yandex.ru",
	"questions": [{
		"code": "0001"
	}, {
		"incomingDate": "2016-11-16"
	}, {
		"registrationDate": "2016-11-17"
	}]
}



А далее пытаюсь отправить файл на тестовом стенде и получаю ошибку:
Код: pascal
1.
Ошибка: Required property 'status' not found in JSON. Path 'questions[0]', line 1, position 267.



Но свойство status стоит в нужном месте и определено в том же формате что и предлагается, почему так?
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475416
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возьмите библиотечку SuperObject, там синтаксис посахарнее :) Или вот этот форк если среда свежая https://github.com/onryldz/x-superobject
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475423
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,

А смысл брать другую библиотеку ?
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475429
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы вам ответить, для удобства работы и лучшей читаемости кода? Хотя если Вы привыкли работать На чистом winapi то да, не стоит :)
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475430
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,

меня просто интересует в чем ошибка в моем коде.
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475432
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На выходе получается файл

Код: pascal
1.
{"departmentId":"715db6d9-0988-4ab0-8546-5a7783b1b362","isDirect":true,"format":"Electronic","number":"1622","createDate":"2016-11-15","name":"Иванов Иван Иванович","address":"г.Москва, ул. Рознина, д.72","email":"mail@yandex.ru","questions":[{"code":"0001"},{"status":"InWork"},{"incomingDate":"2016-11-16"},{"registrationDate":"2016-11-17"}]}
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475468
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну тут вроде status есть
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475473
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы уверены что у вас questions вообще правильно задается, стремная запись если честно, логичнее было бы
[{"code":"0001","status":"InWork","incomingDate":"2016-11-16","registrationDate":"2016-11-17"}]
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475532
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,
А как ее привести к такому виду?

Вообще есть разница?

Между
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
"questions": [
{
"code": "0001",
"status": "InWork",
"incomingDate": "2016-11-16",
"registrationDate": "2016-11-17"
}
]



и этим
Код: pascal
1.
[{"code":"0001","status":"InWork","incomingDate":"2016-11-16","registrationDate":"2016-11-17"}]
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475535
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и этим

Код: sql
1.
2.
3.
4.
5.
6.
7.
"questions": [{
		"code": "0001"
	}, {
		"incomingDate": "2016-11-16"
	}, {
		"registrationDate": "2016-11-17"
	}]
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475581
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все получилось, энди вы 100% были правы!

Код: 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.
39.
40.
41.
procedure TForm1.Button2Click(Sender: TObject);
var
  JSONObject: TJSONObject;
  JSONObject2: TJSONObject;
  JsonArray: TJSONArray;
  PostData: TStringStream;
begin
  JSONObject := TJSONObject.Create;
  PostData := TStringStream.Create;
  try
    JSONObject.AddPair('departmentId',
      TJSONString.Create('715db6d9-0988-4ab0-8546-5a7783b1b362'));
    JSONObject.AddPair('isDirect', TJSONTrue.Create);
    JSONObject.AddPair('format', TJSONString.Create('Electronic'));
    JSONObject.AddPair('number', TJSONString.Create('1622'));
    JSONObject.AddPair('createDate', TJSONString.Create('2016-11-15'));
    JSONObject.AddPair('name', TJSONString.Create('Иванов Иван Иванович'));
    JSONObject.AddPair('address',
      TJSONString.Create('г.Калуга, ул. Рознина, д.72'));
    JSONObject.AddPair('email', TJSONString.Create('mail@yandex.ru'));


    JsonArray := TJSONArray.Create();
    JSONObject.AddPair('questions', JsonArray);
    JSONObject2 := TJSONObject.Create;
    JSONObject2.AddPair('code', TJSONString.Create('0001'));
    JSONObject2.AddPair('status', TJSONString.Create('InWork'));
    JSONObject2.AddPair('incomingDate', TJSONString.Create('2016-11-16'));
    JSONObject2.AddPair('registrationDate', TJSONString.Create('2016-11-17'));
    JsonArray.AddElement(JSONObject2);

    PostData.WriteString(JSONObject.ToString);

    PostData.SaveToFile('1.json');

  finally
    PostData.Free;
    JSONObject.Free;
  end;

end;
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475583
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выход
Код: pascal
1.
{"departmentId":"715db6d9-0988-4ab0-8546-5a7783b1b362","isDirect":true,"format":"Electronic","number":"1622","createDate":"2016-11-15","name":"Иванов Иван Иванович","address":"г.Калуга, ул. Рознина, д.72","email":"mail@yandex.ru","questions":[{"code":"0001","status":"InWork","incomingDate":"2016-11-16","registrationDate":"2016-11-17"}]}
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39475639
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На здоровье, но на те библиотечки все же посмотрите, там код получается намного чище да и работать проще.
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39658949
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоит аналогичная задача. Выполняю Post запрос
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TForm1.Button1Click(Sender: TObject);
var
  PostData: TStringStream;
  ResponseBody: string;
  Json: String;
begin
  Json := '{"name": "никольское"}';
  PostData := TStringStream.Create(Utf8Encode(Json));
  try
    IdHTTP1.Request.ContentType := 'application/json';
    IdHTTP1.Request.Accept := 'application/json';
    IdHTTP1.Request.ContentEncoding := 'utf-8';
    ResponseBody := IdHTTP1.Post(
      'http://10.231.201.200/SstuRf/PublicApi/HandlingReport/SearchDepartments'
        , PostData);
    ShowMessage(IdHTTP1.ResponseText);
    ShowMessage(ResponseBody);
  finally
    PostData.Free;
  end;
end;



получаю ответ:
Код: xml
1.
[{"id":"30b54946-dfc8-e511-92f9-000c2903de7e","name":"??????? ??????? / ??????????? ??????? / ????????????? ?????? ??????????? ??????? / ????????????? ??????????? ?????????????? ?????? ??????????? ??????? / ???????? ????????? / ????????????? ?????????????? ??????????? \"???????? ????????? ??????????\" ??????????? ?????????????? ?????? ??????????? ??????? / ?????????????-???????????????? ?????? ?????????????? ??????????? / ????????????? ?????????????? ??????????? \"???????? ????????? ??????????\" ??????????? ?????????????? ?????? ??????????? ???????"},


Как я понимаю проблема кодировкой. Но как ее победить не могу понять.
Куда копать?
...
Рейтинг: 0 / 0
Json-запрос для получения ответа от сервера
    #39658972
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема решена. Для нуждающихся:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm1.Button10Click(Sender: TObject);
var
  PostData: TStringStream;
  ResponseBody: String;
  Json: String;
begin
  Json := '{"name": "никольское"}';
  PostData := TStringStream.Create(Utf8Encode(Json));
  try
    IdHTTP1.Request.ContentType := 'application/json';
    IdHTTP1.Request.Accept := 'application/json';
    IdHTTP1.Request.ContentEncoding := 'utf-8';

    ResponseBody := Utf8ToAnsi(IdHTTP1.Post('http://10.231.201.200/SstuRf/PublicApi/HandlingReport/SearchDepartments', PostData, IndyTextEncoding_UTF8));
    ShowMessage(IdHTTP1.ResponseText);
    ShowMessage(ResponseBody)
  finally
    PostData.Free;
  end;
end;
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Json-запрос для получения ответа от сервера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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