如何在Flurl中更改Content-Type?

时间:2017-12-06 18:35:28

标签: c# asp.net-core content-type asp.net-core-webapi flurl

我有一个.NET Core 2.0 WebApi应用程序,我在其中添加了“Flurl.Http”(版本2.1.0)NuGet包到我的项目中。

我正在尝试使用Flurl对Visual Studio Team Services(VSTS)Api端点之一进行简单的REST API调用。

但是,我调用的特定VSTS api端点要求将Content-Type设置为“application / json-patch + json”而不是典型的“application / json”。

在我的Flurl调用中,我使用“WithHeader()”方法尝试在请求的标头中设置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”,这是我试图设置的它在标题中。)

3 个答案:

答案 0 :(得分:2)

更新:从Flurl.Http 2.3.1开始修复该错误,因此不再需要这种解决办法。

简短的回答是我认为你发现了一个错误。 PostJsonAsync确实设置了Content-Type标头,但我认为如果你已经自己设置它,应该不管它。如果您可以报告here我应该能够在下一个版本中修复它。

解决方法相当简单。您只需要采取一些额外步骤来构建内容,然后使用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了解正确的方法。

答案 1 :(得分:0)

我能够弄清楚并找到解决问题的有效方法。

以下是我的工作代码的更新版本:

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是一个抽象类。一旦我找到了实现抽象类HttpContent的所有具体类,那么我选择了最符合我情况的那个并将其插入到PostAsync方法中。

在这种情况下,StringContent类是最符合我需要的类。 StringContent的一个构造函数将Content-Type作为其参数之一。所以我传递了我的自定义Content-Type,一切都按预期工作。

答案 2 :(得分:0)

新答案:升级到最新的Flurl.Http issue已在2.3.1中修复,因此问题中发布的代码(最干净的方法)实际上应该按预期工作。