【问题标题】:How to change Content-Type in Flurl?如何更改 Flurl 中的内容类型?
【发布时间】:2018-05-20 17:50:20
【问题描述】:

我有一个 .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”,这是我尝试设置的它在标题中。)

【问题讨论】:

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


【解决方案1】:

更新:该错误自 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 了解正确的做法。

【讨论】:

  • 非常感谢!我最终做了一些非常相似的事情并且能够弄清楚。我将很快发布我所做的,作为我自己问题的答案。
  • 我为此github.com/tmenier/Flurl/issues/256创建了一个问题
【解决方案2】:

新答案:升级到最新的 Flurl.Httpissue 已在 2.3.1 中修复,因此问题中发布的代码(最干净的方法)现在应该可以正常工作了。

【讨论】:

    【解决方案3】:

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

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

    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,一切都按预期工作。

    【讨论】:

    • 这或多或少是相同的解决方案。主要区别在于我使用 Flurl 对象 CapturedStringContent,它允许从 FlurlHttpException 进行更好的诊断,因为您可以访问请求正文和 GlobalSettings,以防万一您对默认 JSON searializer 进行了任何调整。跨度>
    猜你喜欢
    • 2017-11-14
    • 2010-10-29
    • 1970-01-01
    • 2012-09-22
    • 2018-08-30
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多