如何更改FLURL客户端的HTTP请求内容类型?

我使用flurl来提交HTTP请求,这非常有用。 现在我需要为“application / json; odata = verbose”的某些请求更改“ Content-Type”标头

    public async Task<Job> AddJob()
    {

        var flurlClient = GetBaseUrlForGetOperations("Jobs").WithHeader("Content-Type", "application/json;odata=verbose");
        return await flurlClient.PostJsonAsync(new
        {
            //Some parameters here which are not the problem since tested with Postman

        }).ReceiveJson<Job>();
    }

    private IFlurlClient GetBaseUrlForOperations(string resource)
    {
        var url = _azureApiUrl
            .AppendPathSegment("api")
            .AppendPathSegment(resource)
            .WithOAuthBearerToken(AzureAuthentication.AccessToken)
            .WithHeader("x-ms-version", "2.11")
            .WithHeader("Accept", "application/json");
        return url;
    }

你可以看到我试图添加上面的头( .WithHeader("Content-Type", "application/json;odata=verbose")

不幸的是,这给了我以下错误:

“InvalidOperationException:错误使用的标题名称。确保请求标头与HttpRequestMessage一起使用,使用HttpResponseMessage响应标头,以及使用HttpContent对象的内容标头。”

我也试过flurl的“ConfigureHttpClient”方法,但找不到如何/在哪里设置内容类型头。


这个答案已经过时了。 升级到最新版本(2.0或更高版本)并且问题消失。

事实证明,真正的问题与System.Net.Http API如何验证头文件有关。 它区分了请求级别标头和内容级别标头,因为原始HTTP没有这种区别(除了可能在多部分场景中),我总是会发现它有点奇怪。 Flurl的WithHeaderHttpRequestMessage对象添加了头文件,但是未能验证Content-Type ,它希望将其添加到HttpContent对象中。

这些API确实可以让你跳过验证,虽然Flurl不直接公开它,但是你可以很容易地得到它,而不会破坏流畅的链:

return await GetBaseUrlForGetOperations("Jobs")
    .ConfigureHttpClient(c => c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json;odata=verbose"))
    .PostJsonAsync(new { ... })
    .ReceiveJson<Job>();

这可能是做你需要的最好的方法,并且仍然利用Flurl的优点,即不必直接处理序列化, HttpContent对象等。

我强烈建议考虑更改Flurl的AddHeader(s)实现以基于此问题使用TryAddWithoutValidation


我不是OData的专家,我不知道你在调用什么API(SharePoint?),但是基于我见过的大多数例子,你通常想要做的是让服务器发送详细的OData响应,而不是声明你在请求中发送它。 换句话说,您想要在Accept标头上设置;odata=verbose位,而不是Content-Typeapplication/json对于Content-Type应该足够好,Flurl会自动为你设置,所以试试这个改变,看看它是否有效:

.WithHeader("Accept", "application/json;odata=verbose");

我发现的评论和另一篇文章(当我再次找到时会添加参考)已经指出我正确的方向。 我的问题的解决方案如下所示:

        var jobInJson = JsonConvert.SerializeObject(job);
        var json = new StringContent(jobInJson, Encoding.UTF8);
        json.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json; odata=verbose");

        var flurClient = GetBaseUrlForOperations("Jobs");

        return await flurClient.PostAsync(json).ReceiveJson<Job>();

编辑:找到相关的SO问题:通过REST的Azure编码作业失败

链接地址: http://www.djcxy.com/p/46259.html

上一篇: How to change the HTTP Request Content Type for FLURL Client?

下一篇: How to set HttpHeader on individual request using HttpClient