Здравствуйте, 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?"