Re[26]: Язык Go - слабые стороны
От: Cyberax Марс  
Дата: 23.02.22 01:09
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

C>>Ничерта в REST не встроено. Он просто даёт по морде HTTP запросом — и вперёд с песней реализовывать. В результате, 99 из 100 REST-серверов не будут нормально поддерживать чуть менее, чем весь HTTP.

S>Вы так говорите, как будто это плохо.
Да, это плохо. Все ограничения и способности API должны быть описаны в его схеме. По факту в REST это совсем не так.

Например, имеем вот это API: https://docs.docker.com/engine/api/v1.41/#operation/ContainerArchiveInfo — "взять архив файловой системы".

Внимание, вопрос! Как это API будет взаимодействовать с Range?

S>А на практике это позволяет делать graceful degradation. Например, мы можем поставить прокси в любом месте соединения между клиентом и сервером (хоть прямой прокси на стороне клиента, хоть реверс прокси на стороне сервера), и получить оптимизацию conditional get, не написав ни строчки кода ни там ни там.

S>Более того — именно так и делается в 99 из 100 промышленных API, которые отдаются через CDN.
Не видел пока вообще ни одного API, где был бы conditional get. Более того, я даже не видел клиентов, которые его бы поддерживали.

Так что на практике получается, что всё преимущество REST API заключается ровно в одном сценарии с выдачей статических файлов, и может быть реализована только при использовании клиента, который специально написан для этого.

C>>Не будут. Делаем нужные параметры запроса явным параметром и всё. Для примера, если что-то типа DownloadFile, то в запрос добавляем опциональные поля типа Range и прочих. В качестве бонуса, не нужно заниматься разбором формата Range.

S> Покажите мне реальный (g)RPC API в котором есть опциональные параметры типа Range и прочих.
То есть? Это будет просто параметр в API.

Типа:
service FileService {
  rpc DownloadData(in DownloadDataRequest) returns (stream DataChunk);
}

message DownloadDataRequest {
   message ChunkRange {
      uint64 offset = 1;
      uint64 size = 2;
   }
   string file_id = 1;
   repeated ChunkRange chunks = 2;
}

message DataChunk {
   uint64 chunk_index = 1;
   uint64 offset = 2;
   uint64 size = 3;
   bytes data = 4;
}


По API сразу понятно что и как использовать. Не надо гадать: "А поддерживает ли API-сервер Range?"
Sapienti sat!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.