0
Answered

dadata и Delphi

Виктор 2 years ago updated by Антон 12 months ago 8

Здравствуйте. К сожалению не нашел модуля на делфи. Мне надо создать запрос по XML. Получить ответ . 

Целый день пытаюcь, но не получается. МОжет у кого то есть готовые решения, как сделать запрос и получить ответ на DELPHI? Интересует XML


Вот что насобирал. Компилируется. Но ошибка там неверный запрос.

procedure TForm1.Button1Click(Sender: TObject);
var ResponseOut: TStringStream;
     httpRequest:TStrings;
begin
 ResponseOut := TStringStream.Create('');
 httpRequest := TStringList.Create;
 httpRequest.Add ('Content-Type: application/xml');
 httpRequest.Add ('Accept: application/xml');
 httpRequest.Add ('Authorization: Token ***');
 httpRequest.Add ('<req>');
httpRequest.Add  ('<query>Москва</query>');
 httpRequest.Add ('</req>');

 with IdHTTP1 do
 begin

  Request.ContentType:='text/xml; charset=utf-8';
  IdHTTP1.Post('http://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address',httpRequest,ResponseOut);
 end;

 memo1.Lines.Add(ResponseOut.DataString);

end;

end.


сервис: подсказки интерфейс: сторонний модуль

Все получилось! 


procedure TForm1.Button1Click(Sender: TObject);
var
  stringstream: TStringStream;
begin
  stringstream:=TStringStream.Create('');
  try
    IdHTTP1.Request.ContentEncoding := 'utf-8';
    IdHTTP1.Request.ContentType:='application/xml';
    IdHTTP1.Request.Accept:='application/xml';
    IdHTTP1.Request.CustomHeaders.Add('Authorization: Token ***');
    stringstream.WriteString(UTF8Encode('<req><query>Киров</query></req>'));

    Memo1.Text:=IdHTTP1.Post('http://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address', stringstream);
    Memo1.Text :=Utf8ToAnsi(Memo1.Text)
  finally
    stringstream.Free;
  end;
end;

end.


Answered

Отлично! Спасибо, что сообщили.

Если появятся вопросы — обращайтесь.

пытаюсь повторить код, но возвращается http/1.1 500 internal Server Error.

на форме IdHTTP1 + IdSSLIOHandlerSocketOpenSSL1.

Может IdHTTP1 еще надо как-то настраивать? подскажите как

Приложите полный код архивом, посмотрим.

Понял ошибку. Отправлял фамилию на адрес проверки организаций

Хорошо, что разобрались. Пишите, если будут вопросы.

Добрый день, тоже пытаюсь повторить код в Delphi, но  всегда выдает ошибку: Project Project1.exe raised exception class EIdHTTPProtocolException with message 'HTTP/1.1 400 Bad Request'.

В чем может быть проблема?

Разобрался, потомкам может пригодится:

function GetDaData(URL, ContentType, Accept, Token, Body: string): string;
var
    IdHTTP1: TIdHTTP;
    StringStream: TStringStream;
begin
    IdHTTP1 := TIdHTTP.Create;
    StringStream := TStringStream.Create('', TEncoding.UTF8);

    try
        IdHTTP1.HTTPOptions := [hoKeepOrigProtocol,hoForceEncodeParams,hoNoProtocolErrorException,hoWantProtocolErrorContent];
        IdHTTP1.Request.ContentEncoding := 'UTF-8';
        IdHTTP1.Request.ContentType := ContentType;
        IdHTTP1.Request.Accept := Accept;

        IdHTTP1.Request.CustomHeaders.Add('Authorization: Token ' + Token);
        StringStream.WriteString(Body);

        Result := IdHTTP1.Post(URL, StringStream);
    finally
        StringStream.Free;
        IdHTTP1.Free;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    URL: string;
    ContentType: string;
    Accept: string;
    Token: string;
    Body: string;
begin
    URL := 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/fio';
    ContentType := 'application/xml';
    Accept := 'application/xml';
    Token := '***';
    Body := 'Рос';
    Memo1.Text := GetDaData(URL, ContentType, Accept, Token, Body)
end;

procedure TForm1.Button2Click(Sender: TObject);
var
    URL: string;
    ContentType: string;
    Accept: string;
    Token: string;
    Body: string;
begin
    URL := 'http://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address';
    ContentType := 'application/json';
    Accept := 'application/json';
    Token := '***';
    Body := '{ "query": "Рос" }';
    Memo1.Text := GetDaData(URL, ContentType, Accept, Token, Body)
end;