我可以通过来自 text 的调用,使用 Postman 连接到我的 Notion 页面。我正在使用我的内部集成。我添加了授权和概念版本标头。我的程序是 Blazor 服务器应用程序,正在使用 Visual Studio。我对尝试 Python 或 JavaScript 不感兴趣。这需要是 Blazor 服务器。
当我使用代码时,出现授权错误 (401)。 else 子句执行。你能帮忙吗?
private async Task GetDatabaseContent()
{
string requestUri = $"https://api.notion.com/v1/pages/{pageId}";
client.DefaultRequestHeaders.Add(name: "Authorization", value: $"Bearer {bearerToken}");
client.DefaultRequestHeaders.Add(name: "Notion-Version", value: "2022-06-28");
HttpResponseMessage response = new HttpResponseMessage();
try
{
response = await httpClient.GetAsync(requestUri);
}
catch (Exception ex)
{
responseMessage = $"Exception: {ex}";
}
if (response.IsSuccessStatusCode)
{
responseMessage = "Success: " + await response.Content.ReadAsStringAsync();
}
else
{
responseMessage = $"Error: {response.Content}";
reasonPhrase = $"Error: {response.ReasonPhrase}";
}
我浏览了 YouTube 上的无数示例,还查看了 Pluralsight 和 Skillshare。
正如评论中...
您有 2 个
HttpClient
实例,并且正在一个实例上设置标头,包括授权标头 - client
- 但使用另一个实例发送请求 - httpClient
。
每个实例都有自己的
DefaultRequestHeaders
集合,因此您需要在用于发送请求的同一实例上设置标头。
请注意,通常更好的做法是在新的
HttpRequestMessage
中为每个请求设置(大多数)标头,然后将其与 .SendAsync()
一起使用,而不是例如.GetAsync()
。
除非您有一个非常简单的单线程应用程序,否则对于
HttpClient.DefaultRequestHeaders
的生命周期内的每个请求,HttpClient
应该只具有始终相同的标头,并且 HttpClient
的生命周期通常会反过来成为您应用程序的生命周期。 授权标头通常可以在应用程序的生命周期内更改(因为它过期并更新),并且
DefaultRequestHeaders
不是线程安全的: 在此属性上设置的标头不需要在请求消息上再次设置。
当有未完成的请求时,不应修改 DefaultRequestHeaders。
它比这暗示的还要脆弱,并且同时从多个线程更改
DefaultRequestHeaders
可能会出现问题,因为它的底层(通常)只是一个数组,在不考虑线程安全的情况下进行操作。因此,在任何有意义的多线程应用程序中,每当您设置
DefaultRequestHeaders
值时,您都会创建竞争条件。