【问题标题】:YouTube Api Xamarin Android App PCL HttpClient issueYouTube Api Xamarin Android App PCL HttpClient 问题
【发布时间】:2014-08-18 17:01:57
【问题描述】:

我在 Visual Studio 中创建了一个 PCL,目标是:.NET 4.5、Windows Phone 8、Windows Store Apps、Xamarin Android 和 Xamarin iOS。

此 PCL 通过 HttpClient 请求与 YouTube Data API v3 集成(直接使用客户端库时存在一些问题)。

我已经编写并成功运行了在 Visual Studio 中测试此集成的单元测试(引用 PCL 项目的测试项目),但是,当我在 Xamarin Android 项目(在 Xamarin Studio 中)中使用这些方法时,我收到了 Forbidden 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=snippet&maxResults=50";
        requestString += "&channelId=" + channelId;
        requestString += "&key=" + apiKey;

        if (!String.IsNullOrEmpty(pageToken))
        {
            requestString += "&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

我最初的想法是,在 Android 上运行 Http 请求标头与直接在 VS 中运行时不同,因此尝试在 Fiddler 中使用模拟器上的反向代理进行比较(问题存在于模拟器和硬件设备上),但是我无法让应用程序通过代理发送网络流量(即使浏览器流量已正确发送到提琴手)。

可能必须为此代理设置 HttpClient 处理程序,但由于对 PCL 中 System.Net 库的访问受限,不清楚如何实现这一点。

我是否应该为这些 GET 请求另外设置一些东西,请记住,在我明确发送 OAuth2 令牌作为身份验证标头(必需)的 POST 请求(例如插入,插入订阅)中工作正常吗?

任何建议将不胜感激。

更新

尝试使用 ModernHttpClient,但异常仍然存在。仍然觉得这与请求标头有关,但目前还没有确凿证据。

【问题讨论】:

  • 从 NuGet 尝试 ModernHttpClient。它是原生客户端之上的跨平台层,它使用 System.Net.Http(与 HttpClient 完全兼容)
  • @xakz 感谢您的评论。我确实考虑了 ModernHttpClient,但认为首先理解这里的潜在问题是值得的。假设我可以将 NuGet 包添加到 PCL,我会试一试,看看它是否能解决问题。
  • @xakz 我已经尝试了 ModernHttpClient 的请求,但遗憾的是看到了同样的异常。正如宣传的那样,虽然通话可能会更快一些,所以我可能会继续使用它。我可能不得不尝试一些其他 GET 请求作为比较,因为它与我的 POST 请求没有问题,可能是由于传递了身份验证令牌。再次感谢。

标签: c# android .net youtube-api xamarin


【解决方案1】:

所以问题仅限于 YouTube 数据 API,而不是一般的 PCL 问题(谢天谢地)。似乎在向 YouTube API(例如搜索等)发出未经身份验证的请求时,您需要使用 Web API 密钥,而不是 Android API 密钥?!即使在发出经过身份验证的请求(使用 OAuth2)时,您也需要使用 Android 密钥并将请求与解决方案 SHA1 密钥相关联。希望这可以帮助其他人,如果他们也遇到这个问题。

我想这确实引发了一个问题,为什么在公共 API 访问似乎不起作用时可以选择添加一个 Android API 密钥并且应该使用 Web API 密钥?

【讨论】:

  • 你在 Fiddler 中看到过你的请求吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多