Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / JSON-запрос через idHTTP.POST ничего не возвращает / 19 сообщений из 19, страница 1 из 1
17.09.2018, 18:40
    #39703815
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Всем доброго дня!
Пытаюсь выполнить JSON-запрос через HTTP.POST с сайта.
Через всесильный F12 выяснил URL, по которому делается запрос и список передаваемых параметров. Делаю все следующим образом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var
  Response,RequestBody: TStringStream;
  LJSONObject: TJSONObject;
  sparam:string;

///формирование структуры параметров
//sparam -- структура JSON-запроса 

  sparam:=LJSONObject.ToString; 
  RequestBody := TStringStream.Create(sparam);
  Response := TStringStream.Create('');

    HTTP_J.Request.Accept :='application/json';
    HTTP_J.Request.ContentType := 'application/json';
    //search_text.Text -- URL запроса
    HTTP_J.Post(search_text.Text,RequestBody,Response);

      memo1.Text:=Response.DataString;
      Response.Free;
      RequestBody.Free;



В результате получаю только следующее:
{"totalpages":0,"currpage":1,"totalrecords":0,"invdata":[]}

основной сайт: https://market.mosreg.ru/
URL запроса: https://api.market.mosreg.ru/api/Trade/GetTradesForParticipantOrAnonymous
струкрура параметров:
{"classificatorCodes":[],"CustomerAddress":"","CustomerFullNameOrInn":"","filterDateFrom":"2018-09-10T00:00:00.000Z","filterDateTo":null,"filterFillingApplicationEndDateFrom":null,"FilterFillingApplicationEndDateTo":null,"filterPriceMax":"","filterPriceMin":"","filterTradeEasuzNumber":"","IsImmediate":false,"itemsPerPage":10,"OnlyTradesWithMyApplications":false,"page":1,"ParticipantHasApplicationsOnTrade":"","showOnlyOwnTrades":false,"sortingParams":[],"tradeName":"шланг","tradeState":"","UsedClassificatorType":10}

Подскажите, плз, в чем недоработка и куда копать. Харанее благодарен
...
Рейтинг: 0 / 0
17.09.2018, 18:55
    #39703822
NetObserver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Bobby,

Реверс инжениринг?
Может стоит попросить документацию у владельцев сайта?
...
Рейтинг: 0 / 0
18.09.2018, 01:21
    #39703904
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Вот что нагуглилось, попробуйте:

Код: pascal
1.
2.
response.Position := 0; // !!!
memo1.Lines.LoadFromStream(response);
...
Рейтинг: 0 / 0
18.09.2018, 10:11
    #39704035
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Кроик Семён,
К сожалению не помогло ((
...
Рейтинг: 0 / 0
18.09.2018, 10:52
    #39704083
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
ОК, с Indy если честно давно дела не имел, перешел после каких-то глюков с FTP давно уже на Synapse TCP/IP and serial library .
Держите код, вдруг тоже перейдете :)

Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
type
   THttpRequestType  = (rqPost, rqGet);

   function SendHttpRequest(AHttpRequestType: THttpRequestType;
                            const AURL, APOSTData: string;
                            const AResponse: TStream;
                            var AErrMsg: string;
                            const AHttpUserName: string = '';
                            const AHttpPassword: string = '';
                            AAsMozillaUserAgent: boolean = false;
                            AAnotherHeaderLines: TStrings = nil;
                            const AProxyServerIP: string = '';
                            const AProxyServerPort: integer = 0;
                            const AProxyUser: string = '';
                            const AProxyPassword: string = ''): Boolean;


USES ssl_openssl, HTTPSend;

//------------------------------------------------------------------------------						
procedure PrepareHTTPSendAsMozilla(AHTTP: THTTPSend);
begin
   AHTTP.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0';

   //AHTTP.Headers.Add('Accept-Encoding: gzip, deflate, br');
   AHTTP.Headers.Add('Accept-Language: de,en-US;q=0.7,en;q=0.3');
   AHTTP.Headers.Add('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
end;
//------------------------------------------------------------------------------
procedure WriteTextInStream(const AText: string; AStream: TStream);
var
   pText    : PChar;
begin
   pText:=PChar(AText);
   AStream.Write(pText^,Length(AText));
end;
//------------------------------------------------------------------------------
						

//based on Synapse
//For HTTPS-Support:
//  1) USES ssl_openssl;
//  2) copy libeay32.dll
//  3) copy ssleay32.dll

function SendHttpRequest(AHttpRequestType: THttpRequestType;
                         const AURL, APOSTData: string;
                         const AResponse: TStream;
                         var AErrMsg: string;
                         const AHttpUserName: string;
                         const AHttpPassword: string;
                         AAsMozillaUserAgent: boolean;
                         AAnotherHeaderLines: TStrings;
                         const AProxyServerIP: string;
                         const AProxyServerPort: integer;
                         const AProxyUser: string;
                         const AProxyPassword: string): Boolean;
var
   HTTP: THTTPSend;
begin
   AErrMsg:='';

   HTTP := THTTPSend.Create();
   try
      HTTP.UserName:=AHttpUserName;
      HTTP.Password:=AHttpPassword;
      //-- ShowMessage(HTTP.Sock.SSL.LibName);

      if Trim(AProxyServerIP)<>'' then
      begin
         HTTP.ProxyHost:=Trim(AProxyServerIP);
         HTTP.ProxyPort:=IntToStr(AProxyServerPort);
         HTTP.ProxyUser:=Trim(AProxyUser);
         HTTP.ProxyPass:=Trim(AProxyPassword);
      end;

      if AHttpRequestType=rqPost then
      begin
         WriteTextInStream(APOSTData, HTTP.Document);
         HTTP.MimeType := 'application/x-www-form-urlencoded';
      end;

      if AAsMozillaUserAgent then
         PrepareHTTPSendAsMozilla(HTTP);
               
      if Assigned(AAnotherHeaderLines) then
         HTTP.Headers.AddStrings(AAnotherHeaderLines);

      if AHttpRequestType=rqPost then
         Result := HTTP.HTTPMethod('POST', AURL)
      else
         Result := HTTP.HTTPMethod('GET', AURL);

      if Result then
         AResponse.CopyFrom(HTTP.Document, 0)
      else
         AErrMsg:=HTTP.Sock.LastErrorDesc;
   finally
      FreeAndNil(HTTP);
   end;
end;
...
Рейтинг: 0 / 0
18.09.2018, 10:59
    #39704087
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
P.S.
и считывание Response в качестве строки
Код: 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.
var
   Mem       : TMemoryStream;
   sErrMsg   : string;
   bOK       : boolean;
   
   iLen      : integer;
   sResponse : string;
begin
   sResponse:='';
   sErrMsg:='';

   Mem:=TMemoryStream.Create();
   try
      bOK:=SendHttpRequest(AHttpRequestType,
                           AURL,APOSTData,
                           Mem,
                           AErrMsg);

      if bOK then
      begin
         mem.Position:=0;
         iLen:=mem.Size;
         
         if iLen>0 then
         begin
            SetLength(sResponse, iLen);         
            mem.ReadBuffer(sResponse[1], iLen);
         end;
      end
   finally
      FreeAndNil(Mem);
   end;
...
Рейтинг: 0 / 0
18.09.2018, 11:15
    #39704106
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Кроик Семён,
Спасибо, мил человек! Именно это и решил сделать, попробовать через Synapse, а тут такой рояль в кустах. Сейчас буду ковырять
...
Рейтинг: 0 / 0
18.09.2018, 11:27
    #39704114
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Tолько сейчас заметил, у вас HTTPS а не HTTP. Возможно, в этом была заковыка.
Но раз вы уже решили переходить на Synapse, вам еще две либы от OpenSSL понадобятся ( ssleay32.dll и libeay32.dll ).

https://indy.fulgan.com/SSL/
openssl-1.0.2n-i386-win32.zip
...
Рейтинг: 0 / 0
18.09.2018, 12:31
    #39704166
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
если уж переходы, то может и родная либа сгодится ? ))
THttpClient ?
...
Рейтинг: 0 / 0
18.09.2018, 15:05
    #39704320
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Кроик Семён,
С либами все нормально, давно есть уже. Вот только возвращать мне запрос стал примерно вот это (см. вложение). Видимо где-то с кодировкой косяк, не могу понять гду
...
Рейтинг: 0 / 0
18.09.2018, 15:05
    #39704321
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Кроик Семён,
...
Рейтинг: 0 / 0
18.09.2018, 15:12
    #39704328
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Не знаю, может вы работаете как с Unicode'ом.
Может надо String на AnsiString заменить ...
...
Рейтинг: 0 / 0
18.09.2018, 15:23
    #39704341
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
поставьте брейкпоинт и посмотрите, что там в Stream'e. Может покажет .... не знаю, как там в более поздних чем у меня версиях Delphi 6, вдруг дебаггер умеет содержимое MemoryStream'a показывать
...
Рейтинг: 0 / 0
18.09.2018, 15:25
    #39704342
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Но по крайней мере можно
Код: pascal
1.
2.
3.
4.
5.
6.
var
   Response  : TMemoryStream
begin 
   ...
   ...
   Response.SaveToFile('response.dat');
...
Рейтинг: 0 / 0
18.09.2018, 16:44
    #39704417
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Кроик Семён,
Все решилось вот чем:
Код: pascal
1.
2.
3.
4.
          Response:=TStringstream.Create('',Tencoding.ASCII);
          Response.CopyFrom(HTTPSend.Document, 0);
          memo1.Text:=(Response.DataString);
          Response.Free;


Но вылезла новая проблема. Сервер вернул в итоге вот что:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
  <TITLE>Bad Request</TITLE>
  <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii">
</HEAD>
<BODY>
  <h2>Bad Request - Invalid Header</h2>
  <hr><p>HTTP Error 400. The request has an invalid header name.</p>
</BODY>
</HTML>


И что с этим делать пока ума не приложу
...
Рейтинг: 0 / 0
18.09.2018, 16:44
    #39704419
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Bobby"tradeName":"шланг"
А в нужной ли кодировке запрос это отправляет? SmSniff в помощь
...
Рейтинг: 0 / 0
18.09.2018, 17:12
    #39704442
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
не знаю, может им заголовков не хватает. Вот из другого запроса, но все же (Воспользуйтесь параметром AAnotherHeaderLines):
...
Рейтинг: 0 / 0
18.09.2018, 17:43
    #39704465
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Формат как в процедуре PrepareHTTPSendAsMozilla
...
Рейтинг: 0 / 0
19.09.2018, 23:17
    #39705287
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSON-запрос через idHTTP.POST ничего не возвращает
Кроик Семён,
В итоге все заколосилось с THttpClient.
Спасибо за помощь!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / JSON-запрос через idHTTP.POST ничего не возвращает / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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