如何在 Flurl 中更改 Content-Type?
How to change Content-Type in Flurl?
我有一个 .NET Core 2.0 WebApi 应用程序,我在其中将 "Flurl.Http"(版本 2.1.0)NuGet 包添加到我的项目中。
我正在尝试使用 Flurl 对 Visual Studio 团队服务 (VSTS) Api 端点之一进行简单的 REST API 调用。
但是,我调用的特定 VSTS api 端点要求将 Content-Type 设置为 "application/json-patch+json" 而不是典型的 "application/json".
在我的 Flurl 调用中,我使用 "WithHeader()" 方法尝试在请求的 header 中设置 Content-Type,但它不起作用。 Flurl 似乎不允许我覆盖 PostJsonAsync 方法中内置的默认值或标准 Content-Type。
有人知道如何使用 Flurl 更改请求的 Content-Type 吗?或者如何正确覆盖 Flurl 配置中 Content-Type 的默认行为?
提前致谢!
我的代码:
public bool CreateNewBug(NewBugRequest newBugRequest)
{
return _apiUrlToCreateNewBug.WithHeader("Authorization", "Basic Base64PersonalAccessTokenGoesHere")
.WithHeader("Content-Type", "application/json-patch+json")
.PostJsonAsync(newBugRequest.Fields)
.Result
.IsSuccessStatusCode;
}
(此代码有效,但 VSTS api 的响应是 Content-Type 是不允许的,需要更改为 "application/json-patch+json",这是我试图在 header.)
中设置的
更新:该错误已在 Flurl.Http 2.3.1 中修复,因此不再需要此 work-around。
简短的回答是我认为您发现了一个错误。 PostJsonAsync
确实设置了 Content-Type header,但我认为如果您已经自己设置了它,就不要管它。如果你能报告它 here 我应该能够在下一个版本中修复它。
work-around 相当简单。您只需要采取一些额外的步骤来构建内容,然后 post 使用 PostAsync
而不是 PostJsonAsync
。
var json = FlurlHttp.GlobalSettings.JsonSerializer.Serialize(newBugRequest.Fields);
var content = new CapturedStringContent(json, Encoding.UTF8, "application/json-patch+json");
return _apiUrlToCreateNewBug
.WithHeader("Authorization", "Basic Base64PersonalAccessTokenGoesHere")
.PostAsync(content);
如果您经常需要这样做,您可以将其包装在扩展方法(PostJsonPatchAsync
或类似方法)中,以便您可以流畅地调用它。请参阅 here 了解正确的方法。
我能够弄清楚并找到解决问题的有效方法。
这是我的工作代码的更新版本:
public HttpResponseMessage CreateNewBug(NewBugRequest newBugRequest)
{
return _apiUrlToCreateNewBug.AllowAnyHttpStatus()
.WithBasicAuth("", _personalAccessTokenForBasicAuth)
.PostAsync(new StringContent(JsonConvert.SerializeObject(newBugRequest.Fields), Encoding.UTF8, "application/json-patch+json"))
.Result;
}
PostAsync 方法接收一个 HttpContent 对象。 HttpContent 是一个抽象 class。一旦我弄清楚了实现抽象 class HttpContent 的所有具体 classes,然后我选择了最适合我的情况并将其插入 PostAsync 方法。
在这种情况下,StringContent class 是最适合我需要的那个。 StringContent 的构造函数之一将 Content-Type 作为其参数之一。所以我传入了我的自定义 Content-Type,一切都按预期工作。
新答案:升级到最新Flurl.Http。 issue 已在 2.3.1 中得到修复,因此问题中发布的代码(最干净的方法)现在应该可以按预期实际工作。
我有一个 .NET Core 2.0 WebApi 应用程序,我在其中将 "Flurl.Http"(版本 2.1.0)NuGet 包添加到我的项目中。
我正在尝试使用 Flurl 对 Visual Studio 团队服务 (VSTS) Api 端点之一进行简单的 REST API 调用。
但是,我调用的特定 VSTS api 端点要求将 Content-Type 设置为 "application/json-patch+json" 而不是典型的 "application/json".
在我的 Flurl 调用中,我使用 "WithHeader()" 方法尝试在请求的 header 中设置 Content-Type,但它不起作用。 Flurl 似乎不允许我覆盖 PostJsonAsync 方法中内置的默认值或标准 Content-Type。
有人知道如何使用 Flurl 更改请求的 Content-Type 吗?或者如何正确覆盖 Flurl 配置中 Content-Type 的默认行为?
提前致谢!
我的代码:
public bool CreateNewBug(NewBugRequest newBugRequest)
{
return _apiUrlToCreateNewBug.WithHeader("Authorization", "Basic Base64PersonalAccessTokenGoesHere")
.WithHeader("Content-Type", "application/json-patch+json")
.PostJsonAsync(newBugRequest.Fields)
.Result
.IsSuccessStatusCode;
}
(此代码有效,但 VSTS api 的响应是 Content-Type 是不允许的,需要更改为 "application/json-patch+json",这是我试图在 header.)
中设置的更新:该错误已在 Flurl.Http 2.3.1 中修复,因此不再需要此 work-around。
简短的回答是我认为您发现了一个错误。 PostJsonAsync
确实设置了 Content-Type header,但我认为如果您已经自己设置了它,就不要管它。如果你能报告它 here 我应该能够在下一个版本中修复它。
work-around 相当简单。您只需要采取一些额外的步骤来构建内容,然后 post 使用 PostAsync
而不是 PostJsonAsync
。
var json = FlurlHttp.GlobalSettings.JsonSerializer.Serialize(newBugRequest.Fields);
var content = new CapturedStringContent(json, Encoding.UTF8, "application/json-patch+json");
return _apiUrlToCreateNewBug
.WithHeader("Authorization", "Basic Base64PersonalAccessTokenGoesHere")
.PostAsync(content);
如果您经常需要这样做,您可以将其包装在扩展方法(PostJsonPatchAsync
或类似方法)中,以便您可以流畅地调用它。请参阅 here 了解正确的方法。
我能够弄清楚并找到解决问题的有效方法。
这是我的工作代码的更新版本:
public HttpResponseMessage CreateNewBug(NewBugRequest newBugRequest)
{
return _apiUrlToCreateNewBug.AllowAnyHttpStatus()
.WithBasicAuth("", _personalAccessTokenForBasicAuth)
.PostAsync(new StringContent(JsonConvert.SerializeObject(newBugRequest.Fields), Encoding.UTF8, "application/json-patch+json"))
.Result;
}
PostAsync 方法接收一个 HttpContent 对象。 HttpContent 是一个抽象 class。一旦我弄清楚了实现抽象 class HttpContent 的所有具体 classes,然后我选择了最适合我的情况并将其插入 PostAsync 方法。
在这种情况下,StringContent class 是最适合我需要的那个。 StringContent 的构造函数之一将 Content-Type 作为其参数之一。所以我传入了我的自定义 Content-Type,一切都按预期工作。
新答案:升级到最新Flurl.Http。 issue 已在 2.3.1 中得到修复,因此问题中发布的代码(最干净的方法)现在应该可以按预期实际工作。