首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Flurl中更改内容类型?

如何在Flurl中更改内容类型?
EN

Stack Overflow用户
提问于 2017-12-06 18:35:28
回答 3查看 3.9K关注 0票数 3

我有一个.NET Core2.0 WebApi应用程序,在其中我向我的项目添加了"Flurl.Http“(Version2.1.0) NuGet包。

我试图使用Flurl对(VSTS)的API端点之一进行简单的REST调用。

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

在我的Flurl调用中,我使用"WithHeader()“方法尝试设置请求头中的Content,但它不起作用。Flurl似乎不允许我覆盖内置在PostJsonAsync方法中的默认或标准内容类型。

有人知道如何使用Flurl更改请求的内容类型吗?或者如何正确地覆盖Flurl配置中的内容类型的默认行为?

提前感谢!

我的代码:

代码语言:javascript
复制
public bool CreateNewBug(NewBugRequest newBugRequest)
{
    return _apiUrlToCreateNewBug.WithHeader("Authorization", "Basic Base64PersonalAccessTokenGoesHere")
                                .WithHeader("Content-Type", "application/json-patch+json")
                                .PostJsonAsync(newBugRequest.Fields)
                                .Result
                                .IsSuccessStatusCode;
}

(这段代码可以工作,但来自VSTS的响应是不允许内容类型的,需要将其更改为“application/json-补丁+json”,这就是我试图在标题中设置的。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-07 04:26:39

更新: Flurl.Http 2.3.1中的bug已经修复,因此不再需要进行此工作。

简单地说,我认为你发现了一个窃听器。PostJsonAsync确实设置了内容类型标头,但如果您已经自己设置了内容类型标头,我认为应该让它单独使用。如果您能够报告它,这里,我应该能够为下一个版本修复它。

解决问题的方法相当简单。您只需要采取一些额外的步骤来构建内容,然后使用PostAsync而不是PostJsonAsync发布它。

代码语言:javascript
复制
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或类似的方法)来包装它,这样您就可以流畅地调用它。有关正确的方法,请参见这里

票数 2
EN

Stack Overflow用户

发布于 2018-04-17 02:17:27

新答案:升级到最新的Flurl.Http问题已经在2.3.1中得到了修正,所以问题中发布的代码(最干净的方法)实际上应该像现在预期的那样工作。

票数 4
EN

Stack Overflow用户

发布于 2017-12-08 17:02:42

我想出了办法,找到了解决问题的有效办法。

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

代码语言:javascript
复制
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作为其参数之一。因此,我传入了我的自定义内容类型,一切都如预期的那样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47681218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档