Проблема с HttpClient PCL приложения YouTube Api Xamarin для Android

#c# #android #.net #youtube-api #xamarin

#c# #Android #.net #youtube-api #xamarin

Вопрос:

Я создал PCL в Visual Studio, ориентированный на .NET 4.5, Windows Phone 8, приложения из магазина Windows, Xamarin Android и Xamarin iOS.

Этот PCL интегрируется с YouTube Data API v3 через запросы HttpClient (возникли некоторые проблемы с использованием клиентской библиотеки напрямую).

Я написал и успешно запустил модульные тесты, которые проверяют эту интеграцию в Visual Studio (тестовый проект, ссылающийся на проект PCL), однако, когда я использую эти методы в проекте Xamarin Android (в Xamarin Studio) Я получаю запрещенную ошибку 403 в одном из методов GET (search.list — GetStringAsync ниже), методы POST, похоже, работают нормально.

Рассматриваемый метод заключается в следующем:-

 public async Task<Google.Apis.YouTube.v3.Data.SearchListResponse> GetVideosForChannelManual(string channelId, string apiKey, string pageToken)
    {
        var requestString = "https://www.googleapis.com/youtube/v3/search?part=snippetamp;maxResults=50";
        requestString  = "amp;channelId="   channelId;
        requestString  = "amp;key="   apiKey;

        if (!String.IsNullOrEmpty(pageToken))
        {
            requestString  = "amp;pageToken="   pageToken;
        }

        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var task = await client.GetStringAsync(requestString);
            var deserializedResponse = JsonConvert.DeserializeObject<Google.Apis.YouTube.v3.Data.SearchListResponse>(task);
            return deserializedResponse;
        }
    }
  

Подробная информация об исключении приведена ниже:-

     [0] {System.Net.Http.HttpRequestException: 403 (Forbidden)
  at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode () [0x00000] in <filename unknown>:0 
  at System.Net.Http.HttpClient <GetStringAsync>c__async5.MoveNext () [0x00000] in <filename unknown>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter`1[System.String].GetResult () [0x00000] in <filename unknown>:0 
  at YouTubeHelpers.YouTubeRepository <GetVideosForChannelManual>d__27.MoveNext () [0x000fa] in c:...YouTubeRepository.cs:187 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <filename unknown>:0 
  at System.Runtime.CompilerServices.TaskAwaiter`1[Google.Apis.YouTube.v3.Data.SearchListResponse].GetResult () [0x00000] in <filename unknown>:0 
  at YouTubeHelpers.YouTubeRepository <GetAllVideosForChannelManual>d__20.MoveNext () [0x00061] in c:..YouTubeRepository.cs:160 } System.Net.Http.HttpRequestException
  

Мои первоначальные мысли заключаются в том, что заголовки Http-запросов отличаются при запуске на Android по сравнению с непосредственно в VS, и поэтому я попытался сравнить в Fiddler с использованием обратного прокси-сервера на эмуляторе (проблема существует в эмуляторе и на аппаратном устройстве), но я не смог заставить приложение отправлять веб-трафик через веб-сервер.прокси (даже если трафик браузера был отправлен в fiddler правильно).

Предположительно, для этого прокси-сервера должен быть установлен обработчик HttpClient, но с ограниченным доступом к системе.Сетевые библиотеки в PCL было неясно, как этого добиться.

Есть ли что-то, что я должен дополнительно настроить для этих запросов GET, имея в виду, что в запросах POST (например, вставить лайк, вставить подписку), где я явно отправляю токен OAuth2 в качестве заголовка аутентификации (обязательно), все работает нормально?

Любые советы будут оценены.

Обновить

Пробовал использовать ModernHttpClient, но исключение по-прежнему сохраняется. Все еще чувствую, что это как-то связано с заголовками запросов, но пока нет дымящегося пистолета.

Комментарии:

1. Попробуйте ModernHttpClient из NuGet. Это кроссплатформенный уровень выше собственных клиентов и использует System.Net.Http (он полностью совместим с HttpClient)

2. @xakz Спасибо за комментарий. Я рассмотрел ModernHttpClient, но подумал, что сначала стоит разобраться в основной проблеме. Предполагая, что я могу просто добавить пакет NuGet в PCL, я попробую и посмотрю, решит ли это проблему.

3. @xakz Я пробовал запросы с помощью ModernHttpClient и, к сожалению, вижу то же исключение. Как и было объявлено, вызовы, вероятно, немного быстрее, поэтому я могу продолжать его использовать. Возможно, мне придется попробовать некоторые другие запросы GET для сравнения, поскольку у него нет проблем с моими запросами POST, вероятно, из-за передачи токена аутентификации. Еще раз спасибо.

Ответ №1:

Таким образом, проблема была ограничена API данных YouTube, а не общей проблемой PCL (к счастью). Кажется, что при выполнении не прошедшего проверку подлинности запроса к API YouTube (например, для поиска и т. Д.) Вам Нужно использовать ключ Web API, а не ключ API Android ?! Несмотря на то, что при выполнении аутентифицированного запроса (с использованием OAuth2) вам необходимо использовать ключ Android и связать запрос с ключом solutions SHA1. Надеюсь, это может помочь кому-то еще, если они тоже столкнутся с этой проблемой.

Я полагаю, это поднимает вопрос о том, почему есть возможность добавить ключ API Android для общедоступного доступа к API, когда он, похоже, не работает, и следует использовать ключ Web API?

Комментарии:

1. Вы когда-нибудь видели свои запросы в Fiddler?