Команда PUT с Indy 8.0.26 в Delphi 6 - PullRequest
0 голосов
/ 09 мая 2018

Я могу отправить POST запрос с TIdHTTP в Indy 8, но я не знаю, как отправить PUT запрос.

var
  Params:TStrings;
  Resp: TMemoryStream;//TMemoryStream;
  URI, sResp: AnsiString;
begin
   try
      Params := TStringList.Create;
      Params.Add(EdPost.Text);
      //Params.Add('Method=PUT');   ???
      Resp := TMemoryStream.Create;
      URI := EdUri.Text + Edit6.Text;   //
      Http1.Request.ContentType := 'application/json';
      Http1.Request.ExtraHeaders.Values['Authorization'] := 'Bearer ' + sTocken;
      //Http1.Request.ExtraHeaders.Values['Method'] :='PUT';    ???
      Http1.Post(URI, Params, Resp);

1 Ответ

0 голосов
/ 09 мая 2018

TIdHTTP в Indy 8 просто не поддерживает PUT запросы. Он поддерживает только запросы HEAD, GET и POST. И, к сожалению, вы не можете принудительно выполнить запрос PUT вручную (без изменения исходного кода Indy), так как метод TIdHTTP.DoRequest() принимает перечисление TIdHTTPMethod, которое определяет только эти 3 HTTP-запроса.

В Indy 9 добавлена ​​поддержка дополнительных HTTP-запросов: OPTIONS, TRACE, PUT, DELETE и CONNECT.

В Indy 10 добавлена ​​поддержка пользовательских HTTP-методов, поэтому TIdHTTP больше не ограничен жестко заданным подмножеством запросов.

Текущая версия Indy (на момент написания этой статьи) - 10.6.2.5457, и она по-прежнему поддерживает Delphi 6 (1) .

Я настоятельно призываю вас перейти с Indy 8, так как он ОЧЕНЬ стар и больше не поддерживается разработчиками Indy. Пожалуйста, не используйте это. Если вы не хотите полностью обновлять Indy 10, обновите до Indy 9 (хотя он больше не поддерживается, за исключением исправлений ошибок).

Тем не менее, существует один возможный обходной путь для Indy 8: IF HTTP-сервер, на который вы отправляете свои данные, поддерживает "туннелирование глаголов", тогда вы можете использовать TIdHTTP.Post() для отправки запроса POST при указании серверу обработать запрос, как если бы он был PUT, например:

// Sadly, there is no *standard* HTTP header for verb tunneling.
// Different vendors use different headers:
//
// Most vendors use 'X-HTTP-Method-Override'
// Microsoft uses 'X-HTTP-Method'
// IBM uses 'X-METHOD-OVERRIDE'
//
// Send whichever one is appropriate for your particular server, or
// just send them all and let the server work it out...

Http1.Request.ExtraHeaders.Values['X-HTTP-Method-Override'] := 'PUT';
Http1.Request.ExtraHeaders.Values['X-HTTP-Method'] := 'PUT';
Http1.Request.ExtraHeaders.Values['X-METHOD-OVERRIDE'] := 'PUT';
Http1.Post(URI, ...);

(1) : поддержка версий Delphi, предшествующих Юникоду, включая Delphi 6, будет прекращена в следующем выпуске технической поддержки для Indy 11. Indy 10 будет последней версией, поддерживающей старые компиляторы.

...