@lucky4

Можно ли вместо Delete-метода использовать POST?

В приложении есть небольшие дыри, когда URL может быть длинной и из-за ее размера => запрос не выполняется
Изменял все Get на Post методы:
public async Task<T> GetAsync<T>(string url)
        {
            var requestMessage = await this.GetHttpMessageRequestWithToken(url, HttpMethod.Get, null);
            var response = await InternalHttpClient.SendAsync(requestMessage);
            return await HandleResponse<T>(response, url);
        }

        public async Task<Res> PostAsync<Req, Res>(string url, Req obj)
        {
            var json = JsonConvert.SerializeObject(obj);
            var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
            var requestMessage = await this.GetHttpMessageRequestWithToken(url, HttpMethod.Post, stringContent);
            var response = await InternalHttpClient.SendAsync(requestMessage);
            return await HandleResponse<Res>(response, url);
        }

К примеру:
var getInfoByIdUrl = BaseUrl + getUrlSegment + "?" + string.Join("&", userIds.Distinct().Select(userId => "userIds=" + userId));

Изменял на:
var getInfoByIdUrl = BaseUrl + getUrlSegment ;
var request = new RequestUserInfoByUsers() { UserIds = userIds.ToArray() };

var userInfos = await DataProvider
                    .PostAsync<RequestUserInfoByUsers, Response<List<GetUserInfoByIdResponse>>>(
                        getInfoByIdUrl ,
                        request);


Случайно, оказалось, что в приложении так же существует Delete:
var deleteUrl = this.BaseUrl + this.NextUrl + "?" + string.Join("&", removedBookingsIds.Select(bookingId => "bookingIds=" + bookingId));


Сработает ли такой же подход для Delete:
public async Task<T> DeleteAsync<T>(string url)
        {
            var requestMessage = await this.GetHttpMessageRequestWithToken(url, HttpMethod.Delete, null);
            var response = await InternalHttpClient.SendAsync(requestMessage);
            return await HandleResponse<T>(response, url);
        }

И как он должен будет выглядит. Делай точь в точь как PostAsync, или же такой подход уже не возможен? Есть ли какие-то другие варианты?
  • Вопрос задан
  • 508 просмотров
Решения вопроса 1
Да, так можно сделать.
Только не сервере не забудь код поправить.

Если бы серверную часть писал я, то я бы подумал над редизайном этой апишки, ибо принимать кучу query-параметров для удаления - это странно и не соответствует идеям rest.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman Куратор тега C#
C# the best
https://habr.com/ru/post/50147/

прочтите для начала вот это.
Разница есть между GET и остальными. Get запрос данные несет в URL, все остальные содержат данные в теле запроса. Единых стандартов нет на длину запросов, каждый браузер и веб-сервер сами решают это (сервер естественно можно настроить).

Не зная ваше приложение, что вам такие объемы гонять приходиться, может WebAPI не то решение, Например стоит выбрать gRPC, он может работать с потоками, а через них можно тонны пропихивать, или у вас с архитектурой проблемы, что вы за раз пытаетесь передать очень много данных, а смысл WebAPI, в работе с единичными сущностями.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы