Перейти к содержанию
Fire Monkey от А до Я
  • 0

TNetHTTPRequest как отправить в body русский текст?


MrDevillio

Вопрос

Добрый день!

Спойлер

function idHttpPost(const aURL: string; aBody: String; var IsExcepted: Boolean): string;
var
  Return: IHTTPResponse;
  HTTPClient: TNetHTTPClient;
  MS: TMemoryStream;
  aBodyStrings: TStringList;
begin
  Result := '';
  IsExcepted := false;

  try
    aBodyStrings := TStringList.Create;
    MS := TMemoryStream.Create;
    HTTPClient := TNetHTTPClient.Create(nil);
    HTTPClient.HandleRedirects := true;
    with TNetHTTPRequest.Create(nil) do
      try
        Client := HTTPClient;
        aBodyStrings.Add(aBody);
        aBodyStrings.WriteBOM := false;
        aBodyStrings.TrailingLineBreak := false;
        aBodyStrings.SaveToStream(MS);
        // aBodyStrings.SaveToStream(MS, TEncoding.ASCII);
        // aBodyStrings.SaveToStream(MS, TEncoding.ANSI);
        // aBodyStrings.SaveToStream(MS, TEncoding.UTF8);
        // aBodyStrings.SaveToStream(MS, TEncoding.Unicode);
        MS.Position := 0;

        try
          Return := post((IfThen(Pos('http', aURL) = 1, '', FAPIServer) + aURL), MS);
          // Return := Post((IfThen(Pos('http', aURL) = 1, '', FAPIServer) + aURL), aBodyStrings);
          Result := UTF8ToString(Return.ContentAsString());

        except
          on e: exception do
          begin
            IsExcepted := true;
            Result := ' -> api error : ' + TimeToStr(Time) + ' ' + e.Message;
          end;
        end;
      finally
        Free;
      end;
  finally
    aBodyStrings.Free;
    MS.Free;
    HTTPClient.Free;
  end;
end;

 

Вот так пытаюсь отправлять запрос на сервер. Если отправляю body как TStringList, мой тестовый webbroker говорит, что Request.Content = '';

Если отправляю body как TMemoryStream (или как TStringStream) то в момент чтения Request.Content получаю EEncodingError.

Вставил вот такую распорку для хоть какого-то чтения Request.Content (этот текст помогает с русскими буквами в других брокерах, когда запросы шлю из Windows приложений через TIdHTTP)

Спойлер

function BinToAscii(const bin: array of byte): AnsiString;
var i: integer;
begin
  SetLength(Result, Length(bin));
  for i := 0 to Length(bin)-1 do
    Result[1+i] := AnsiChar(bin[i]);
end;

function ConvertContentBytesToUnicode(RC: TBytes): String;
begin
  try
    Result := TEncoding.UTF8.GetString(RC);
  except
    Result := BinToAscii (RC);
  end;
end;

 

Но так вижу только англ буквы, русские - вопросами при любом варианте TEncoding при отправке.

Подскажите, как из Android приложения правильно отправлять запросы с русскими буквами в body?

Спасибо!

Изменено пользователем MrDevillio
Ссылка на комментарий

Рекомендуемые сообщения

  • 1

зачем тут utf8tostring
оно и так Unicode

чарсет нужно указывать в запросе. в заголовках. тут никаких свойств запроса не заполнено

кроме того, зачем вам TNetHttpClient. Это компонент - обертка класса THttpClient. Им проще и пользоваться.

Ссылка на комментарий
  • 0

Спасибо вам большое. И правда, перемудрил, вот так работает:

Спойлер

function idHttpPost(const aURL: string; aBody: String; var IsExcepted: Boolean): string;
var
  Return: IHTTPResponse;
  HTTPClient: THTTPClient;
  aBodyStream: TStringStream;
begin
  Result := '';
  IsExcepted := false;

  try
    try
      aBodyStream := TStringStream.Create(aBody, TEncoding.UTF8);
      HTTPClient := THTTPClient.Create;
      with HTTPClient do
      begin
        HandleRedirects := true;
        ContentType := 'application/json';
        Accept := 'application/json';
        Return := Post((IfThen(Pos('http', aURL) = 1, '', FAPIServer) + aURL), aBodyStream);
        Result := Return.ContentAsString;
      end;
    except
      on e: exception do
      begin
        IsExcepted := true;
        Result := ' -> api error : ' + TimeToStr(Time) + ' ' + e.Message;
      end;
    end;
  finally
    aBodyStream.Free;
    HTTPClient.Free;
  end;
end;

 

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...