Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Использование команды PUT в Indy для работы с Microsoft Graph API: настройка заголовков для больших вложений

Delphi , Синтаксис , Справочник по API-функциям

При работе с Microsoft Graph API для загрузки больших вложений может возникнуть необходимость использования команды PUT с указанием заголовков, относящихся к диапазонам данных. В частности, важным является правильное использование заголовка Content-Range, который позволяет серверу понять, какие именно байты данных отправляются клиентом.

Проблема

Разработчики столкнулись с проблемой при использовании команды TIdHttp.Put() для работы с Microsoft Graph API. При попытке отправить данные с указанием заголовка Content-Range сервер возвращал ошибки: либо сообщение о том, что заголовок Content-Range отсутствует, либо о том, что он имеет неверный формат. Это указывало на то, что либо сам механизм отправки данных через Indy не соответствует стандарту HTTP, либо требуются дополнительные настройки.

Код, вызывающий ошибку

Пример кода, который приводил к ошибке, выглядел следующим образом:

sUploadSession := jsnUSession.Get('uploadUrl').JsonValue.Value;
Form1.htp2.Request.ContentType := 'application/octet-stream';
Form1.htp2.Request.ContentLength := iSize; // размер файла
Form1.htp2.Request.CustomHeaders.Clear;
Form1.htp2.Request.CustomHeaders.Add('Content-Range: bytes 0-' + IntToStr(iSize - 1) + '/' + IntToStr(iSize));
{with Form1.htp2.Request.Ranges.Add do
begin
  StartPos := 0;
  EndPos := iSize;
  // ...
end;}
fs := TStringStream.Create('{' + TEncoding.Default.GetString(TFile.ReadAllBytes(sFile)) + '}');
try
  Form1.htp2.Put(sUploadSession, fs);
except
  // обработка исключений
end;

Ошибки

При использовании свойства Ranges получали ошибку о том, что отсутствует заголовок Content-Range. При использовании заголовка Content-Range в свойстве CustomHeaders сервер возвращал ошибку о неверном формате заголовка.

Разъяснение

Заголовки Range и Content-Range в HTTP имеют разное назначение. Заголовок Range используется для запроса определенного диапазона данных от сервера, в то время как Content-Range указывает на диапазон данных, отправляемых клиентом в теле запроса.

Подтвержденное решение

Проблема заключалась в неверном использовании свойства Ranges и в том, что фактический размер данных, отправляемых клиентом, не соответствовал указанному в заголовке Content-Range. Для корректной работы необходимо было использовать свойство CustomHeaders для добавления заголовка Content-Range, а также убедиться, что размер данных, указанный в заголовке, соответствует реальному размеру данных, отправляемых через поток.

Пример корректного использования:

sUploadSession := jsnUSession.Get('uploadUrl').JsonValue.Value;
fs := TFileStream.Create(sFile, fmOpenRead or fmShareDenyWrite);
try
  bLog := True;
  try
    iSize := fs.Size; // получаем размер файла
    Form1.htp2.Request.ContentType := 'application/octet-stream';
    Form1.htp2.Request.ContentLength := iSize;
    Form1.htp2.Request.CustomHeaders.Clear;
    Form1.htp2.Request.CustomHeaders.Add('Content-Range: bytes 0-' + IntToStr(iSize - 1) + '/' + IntToStr(iSize));

    Form1.htp2.Put(sUploadSession, fs);
  except
    // обработка исключений
  end;
finally
  fs.Free;
end;

Также стоит отметить, что Microsoft рекомендует не загружать более 4 МБ данных за один раз при использовании данного API. Если файл больше 4 МБ, его необходимо разделить на части и загружать каждую часть отдельно, обращая внимание на поле NextExpectedRanges в каждом успешном ответе сервера.

Заключение

Команда PUT в Indy может быть использована для работы с Microsoft Graph API, но для корректной настройки заголовков, особенно Content-Range, необходимо тщательно следить за соответствием указанных данных и реальных размеров передаваемых данных.

Создано по материалам из источника по ссылке.

Разработчики столкнулись с трудностями при настройке заголовков для отправки больших вложений через Microsoft Graph API с использованием команды PUT в Indy, в частности, правильное использование заголовка Content-Range было ключевым для успешно


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-09 12:16:46/0.0049059391021729/1