当前位置: 首页 > 知识库问答 >
问题:

如何更改Flurl中的内容类型?

羊舌源
2023-03-14

我有一本书。NETCore2.0WebAPI应用程序,其中我将“Flurl.Http”(版本2.1.0)NuGet包添加到我的项目中。

我正在尝试使用Flurl对一个VisualStudioTeamServices(VSTS)APIendpoint进行简单的RESTAPI调用。

但是,我正在调用的特定VSTS api终结点要求将Content-Type设置为“应用程序/json-补丁json”,而不是典型的“应用程序/json”。

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

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

提前谢谢!

我的代码:

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的响应是不允许使用内容类型,需要将其更改为“application/json patch json”,这是我试图在标题中设置的内容类型。)

共有3个答案

贺运良
2023-03-14

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

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

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的一个构造函数将内容类型作为其参数之一。因此,我传入了我的自定义内容类型,所有内容都按预期工作。

司徒胤
2023-03-14

更新:这个错误是固定的Flurl。http://http 2.3.1,所以这种解决方法不再必要。

简而言之,我认为你发现了一个bugPostJsonAsync确实设置了内容类型标题,但我认为如果您已经自己设置了,那么应该不使用它。如果你能在这里报告的话,我应该可以在下一个版本中修复它。

解决方法相当简单。您只需要采取几个额外的步骤来构建内容,然后使用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或类似的方法)来包装它,这样您就可以流畅地调用它。请参阅此处,了解正确的方法。

高夜洛
2023-03-14

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

 类似资料:
  • 我正在使用flurl提交HTTP请求,这是非常有用的。现在,我需要将一些请求的“content-type”头更改为“application/json;odata=verbose” 您可以看到我如何尝试添加上面的头() 不幸的是,这给了我以下错误: “InvalidOperationException:错误使用的标头名称。请确保请求标头与HttpRequestMessage一起使用,响应标头与Htt

  • 我已经尝试了Flurl的常规PutJsonAsync方法,但没有成功。这是我的代码中唯一的非flurl部分。 事先Thanx。

  • 在我的项目中,我有固定的页眉和页脚,以及可变的内容。所以我已经将ContentControl放在了我的窗口中。 看起来是这样的... 我创建了两个名为page1、Page2用户控件。第1页有一个按钮,当我单击该按钮时,ContentControl有显示Page2。 所以我用button1_Click编写了下面的代码 但是在点击按钮的时候ContentControl没有改变我能做什么呢? 我的pag

  • 为了使图片更完整(也更复杂),假设我还有以下处理程序: 此处理程序允许返回字符串由和序列化,具体取决于客户端传递的。返回类型和值应如下:

  • 问题内容: 我正在为我的Android手机构建一个小型应用程序,以使用非常基本的REST界面将短信转发到网络服务器。 我正在使用android 4.0.3 SDK。我使用Django和Django restframework包在python中开发了Web服务。设置完全是开箱即用的。基本上有一个端点可以接收包含消息信息(发送者,正文,日期)的JSON对象的POST。我已经使用cURL通过以下命令测试

  • 注意:用户界面已经在 Dreamweaver CC 和更高版本中做了简化。因此,您可能在 Dreamweaver CC 和更高版本中找不到本文中描述的一些选项。有关详细信息,请参阅此文章。 关于动态内容 通过对提供内容的服务器行为进行编辑,可以更改页面上的动态内容。例如,您可以编辑记录集服务器行为,以便向页面提供更多的记录。 在“服务器行为”面板中列出了页面上的动态内容。例如,如果向页面中添加了某