Eug*_*erg 5 c# json asp.net-web-api
我有一个非常简单的 C# Http Client 控制台应用程序,它需要将 json 对象的 HTTP POST 发送到 WebAPI v2。目前,我的应用程序可以使用 FormUrlEncodedContent 执行 POST:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using System.Net.Http.Formatting;
namespace Client1
{
class Program
{
class Product
{
public string Name { get; set; }
public double Price { get; set; }
public string Category { get; set; }
}
static void Main(string[] args)
{
RunAsync().Wait();
}
static async Task RunAsync()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:8888/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("Category", "value-1"),
new KeyValuePair<string, string>("Name", "value-2")
});
var result = client.PostAsync("Incident", content).Result;
var r = result;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在 POST 正文中使用 JSON 时,出现错误 415 - 不支持的媒体类型:
class Product
{
public string Name { get; set; }
public double Price { get; set; }
public string Category { get; set; }
}
var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
var response = await client.PostAsJsonAsync("api/products", gizmo);
Run Code Online (Sandbox Code Playgroud)
执行显式 JSON 序列化不会改变我的结果:
string json = JsonConvert.SerializeObject(product);
var response = await client.PostAsJsonAsync("api/products", json);
Run Code Online (Sandbox Code Playgroud)
处理此问题并能够发布 JSON 的正确方法是什么?
如果您希望它作为FormUrlEncodedContent发送,则 MediaTypeWithQualityHeaderValue("application/json") 是错误的。这会将请求内容类型设置为 json。使用 application/x-www-form-urlencoded 代替,或者根本不设置 MediaTypeWithQualityHeaderValue。
| 归档时间: |
|
| 查看次数: |
9086 次 |
| 最近记录: |