Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Json-запрос для получения ответа от сервера / 19 сообщений из 19, страница 1 из 1
20.06.2017, 15:28
    #39474832
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
Ребята, с 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
20.06.2017, 15:44
    #39474852
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
Связаться с разработчиками сервиса и узнать детали работы с ним. Из возможных косяков -- запрос идет почему-то через POST, хотя обычно такие вещи (чтение данных) как раз через GET делаются. Плюс, если это поиск, может надо еще какие настройки указывать (% в начале-конце поисковой строки) или там чуствителен к регистру он и тупо не находит никаких записей (мы ищем с маленькой буквы, а в базе он с большой).
...
Рейтинг: 0 / 0
20.06.2017, 17:02
    #39474953
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
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
21.06.2017, 07:24
    #39475173
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
_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
21.06.2017, 12:51
    #39475401
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
Теперь не могу отправить 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
21.06.2017, 13:03
    #39475416
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
Возьмите библиотечку SuperObject, там синтаксис посахарнее :) Или вот этот форк если среда свежая https://github.com/onryldz/x-superobject
...
Рейтинг: 0 / 0
21.06.2017, 13:11
    #39475423
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
энди,

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

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

Код: 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
21.06.2017, 14:04
    #39475468
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
ну тут вроде status есть
...
Рейтинг: 0 / 0
21.06.2017, 14:07
    #39475473
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
вы уверены что у вас questions вообще правильно задается, стремная запись если честно, логичнее было бы
[{"code":"0001","status":"InWork","incomingDate":"2016-11-16","registrationDate":"2016-11-17"}]
...
Рейтинг: 0 / 0
21.06.2017, 15:00
    #39475532
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
энди,
А как ее привести к такому виду?

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

Между
Код: 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
21.06.2017, 15:01
    #39475535
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
и этим

Код: sql
1.
2.
3.
4.
5.
6.
7.
"questions": [{
		"code": "0001"
	}, {
		"incomingDate": "2016-11-16"
	}, {
		"registrationDate": "2016-11-17"
	}]
...
Рейтинг: 0 / 0
21.06.2017, 15:46
    #39475581
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
Все получилось, энди вы 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
21.06.2017, 15:47
    #39475583
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
Выход
Код: 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
21.06.2017, 16:45
    #39475639
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
На здоровье, но на те библиотечки все же посмотрите, там код получается намного чище да и работать проще.
...
Рейтинг: 0 / 0
09.06.2018, 15:22
    #39658949
Петр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
Стоит аналогичная задача. Выполняю 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
09.06.2018, 16:24
    #39658972
Петр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Json-запрос для получения ответа от сервера
Проблема решена. Для нуждающихся:
Код: 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Json-запрос для получения ответа от сервера / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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