Я пишу демо-приложение для себя, чтобы учиться, и внезапно я начал получать ошибку 403 при выполнении запросов api.stackexchange.com, и мне не удалось выполнить SureSuccessStatusCode(). Я делаю это, чтобы заполнить свою базу данных некоторыми данными тегов. (внедренный клиент просто устанавливает для автоматической декомпрессии значение GZip)
public async Task<List<TagsImport>> ImportStackOverflowTagsAsync()
{
var tagImportsList = new List<TagsImport>();
var httpClient = _httpClient.GetClient();
httpClient.BaseAddress = new Uri("https://api.stackexchange.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
for (var i = 1; i <= 10; i++)
{
var response = await httpClient.GetAsync($"2.3/tags?page = {i}&pagesize=100&order=desc&sort=popular&site=stackoverflow");
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync();
var tags = JsonSerializer.Deserialize<TagsImport>(responseBody);
tagImportsList.Add(tags);
}
return tagImportsList;
}
Попробовал вручную протестировать запрос, а затем протестировать предыдущие версии приложения, тест в приложении просто возвращает «System.Net.Http.HttpRequestException: код состояния ответа не указывает на успех: 403 (запрещено)». при написании вручную «https://api.stackexchange.com/2.3/tags?page=1&pagesize=100&order=desc&sort=popular&site=stackoverflow» в браузере данные возвращаются правильно.
Я что-то упускаю, чтобы это работало?
Используете ли вы ключ API? Уважаете ли вы поле backoff (когда оно отсутствует)? Попробуйте добавить небольшую задержку между вашими запросами.
Если ваша аутентификация не удалась в соответствии с кодом состояния, что-то не так с вашей аутентификацией. И я не вижу ничего в вашем коде.
Я хочу использовать API анонимно, у меня еще осталась квота, и я делаю максимум 10 запросов за одно использование. Он также терпит неудачу при самом первом запросе. Не знаю, как я могу аутентифицировать свое приложение, которое работает только локально, чтобы затем использовать API stackexchange.
Вам обязательно нужно добавить заголовок UserAgent, как указывает один из ответов здесь. В противном случае ошибка 403 гарантирована. Затем вам следует проверить свойство has_more
полученного JSON, чтобы убедиться, что вам нужно получить больше страниц. Может быть, вместо цикла увеличить счетчик и выйти из строя либо если has_more = false
, либо вы достигли своей цели. Добавьте Task.Delay(100)
между вызовами GetAsync()
(или GetStringAsync()
или GetFromJsonAsync<T>()
)
эта ошибка вызвана заголовком User-Agent. По сути, вам нужно добавить заголовок пользовательского агента в ваш httpClient, и он будет вести себя как браузер, получающий данные без проблем.
Сюда скопируйте и вставьте это:
httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/58.0.3029.110 Safari/537.36");
Не знаю, почему за это проголосовали отрицательно. Возможно, форматирование формулировки какое угодно. Но представленное решение, похоже, помогает, поэтому против него проголосовали.
Также прокомментировал это: здесь требуется заголовок UserAgent. Нет необходимости в CookieContainer
Из документации : «403: метод, требующий определенных разрешений, был вызван с токеном доступа, у которого отсутствуют эти разрешения». Не похоже, что вы устанавливаете токен доступа.
Похоже, вы, вероятно, можете использовать неявный поток, описанный здесь, чтобы получить его.
Здесь вы выполняете запрос API в цикле. не получается с первой попытки или только в последующих?