IdHTTP.Post ошибка HTTP/1.1 400 BAD REQUEST

m52
Дата: 31.03.2020 14:05:35
Здравствуйте,

Использую IdHTTP в Delphi XE8
Моя задача - переименовать файл на Яндекс.Диске

Как переименовать - описано здесь: https://yandex.ru/dev/disk/api/reference/move-docpage/

Я формирую и отправляю POST-запрос, как сказано в документации, но в ответ получаю 'HTTP/1.1 400 BAD REQUEST' Код - ниже.

Что я не так делаю?

function TYDClient.Rename(PathOld,PathNew: string; var ResponseCode: integer): string;
var ErrorText, URL, response: string;
    SL: TStringList;
begin
  result:='';
  URL:='https://cloud-api.yandex.net:443/v1/disk/resources/move';

  SL:=TStringList.Create;
  SL.Add('from='+TNetEncoding.URL.Encode('disk:'+PathOld));
  SL.Add('path='+TNetEncoding.URL.Encode('disk:'+PathNew));
  SL.Add('overwrite=true');

  IdHTTP.Request.CustomHeaders.Clear;
  IdHTTP.Request.CustomHeaders.AddValue('Authorization','OAuth '+access_token);
  IdHTTP.Request.CustomHeaders.AddValue('Accept','*/*');
  IdHTTP.Response.Clear;

  response := '';
  try
    response := IdHTTP.Post(URL, SL);
  except on E:Exception do
    ErrorText:=E.Message;
  end;
  SL.free;

  if IdHTTP.ResponseCode<>201 then result:=IdHTTP.ResponseText;
  ResponseCode:=IdHTTP.ResponseCode;
end;

Все остальные манипуляции с файлами на Я.Диске и выполняю запросами GET, PUT, DELETE и все прекрасно работает, но на этот раз мне надо применить запрос POST и не получилось.

Какие будут идеи?
Vizit0r
Дата: 31.03.2020 14:15:15
зачем гадать долго и нудно, если можно через любой http proxy типа Fiddler'а просто сравнить правильный пакет и неправильный?
Kazantsev Alexey
Дата: 31.03.2020 14:17:46
m52
Какие будут идеи?

from, path и прочее, это элементы url, а не тела запроса.
m52
Дата: 31.03.2020 14:26:32
Kazantsev Alexey,

СПАСИБО ОГРОМНОЕ! Вы мне очень помогли!
Я думал, что при отправке POST надо параметры передавать не в строке URL, вот я и передавал из в TStringList по-строчно и был не прав. Переделал так (см.ниже), теперь я тело TStringList передаю пустым, а в URL клею все параметры.

function TYDClient.Rename(PathOld,PathNew: string; var ResponseCode: integer): string;
var ErrorText, URL, response: string;
    SL: TStringList;
begin
  result:='';
  URL:='https://cloud-api.yandex.net:443/v1/disk/resources/move';
  URL:=URL + '?from='+TNetEncoding.URL.Encode('disk:'+PathOld);
  URL:=URL + '&path='+TNetEncoding.URL.Encode('disk:'+PathNew);
  URL:=URL + '&overwrite=true';

  IdHTTP.Request.CustomHeaders.Clear;
  IdHTTP.Request.CustomHeaders.AddValue('Authorization','OAuth '+access_token);
  IdHTTP.Request.CustomHeaders.AddValue('Accept','*/*');
  IdHTTP.Response.Clear;

  SL:=TStringList.Create;
  response := '';
  try
    response := IdHTTP.Post(URL, SL);
  except on E:Exception do
    ErrorText:=E.Message;
  end;
  SL.free;

  if IdHTTP.ResponseCode<>201 then result:=IdHTTP.ResponseText;
  ResponseCode:=IdHTTP.ResponseCode;
end;