如何更改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的WithHeader
为HttpRequestMessage
对象添加了头文件,但是未能验证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-Type 。 application/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