如何将json发布到HTTP服务器

时间:2017-08-24 08:41:17

标签: c# json post httpwebrequest

我想知道如何从json发布到http服务器的帖子。 我用来做json的代码如下:

pedro product = new pedro();
                    product.FirtsName = "Ola";
                    product.ID = 1;
                    product.idade= 10;


                    string json = JsonConvert.SerializeObject(product);

这是pedro类:

 public class pedro
    {
        public int ID { get; set; }
        public string FirtsName { get; set; }
        public int idade { get; set; }
    }

1 个答案:

答案 0 :(得分:0)

使用WebApi,您可以使用以下内容:

string url = "http://url.of.server/";
Pedro product = new Pedro();
product.FirtsName = "Ola";
product.ID = 1;
product.Idade = 10;

using (var client = new HttpClient())
{
       client.BaseAddress = new Uri(url);
       client.DefaultRequestHeaders.Accept.Clear();
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

       HttpResponseMessage response = client.PostAsJsonAsync(url, product).Result;
       if (response.IsSuccessStatusCode)
       {
            // do something
       }
}

如果您没有使用WepApi,则有许多类似的方法,例如:https://stackoverflow.com/a/39414248/7489072

除非你绝对必须/想要发布二进制文件并控制接收网络服务器,否则不要像评论中所建议的那样对帖子正文进行Base64编码。 99%的案例中的Web服务器期望一个纯文本体。 如果需要在ASCII范围之外发布字符,请使用正确的HTTP标头指定Unicode主体负载。

更新1(标题): HttpClient类具有属性DefaultRequestHeaders,可用于设置公共请求标头,例如AcceptEncoding。如果您需要对内容标题进行更细粒度的控制,请使用.PostAsync(字符串uri,HttpContent内容)代替.PostAsJsonAsync(仅为Json内容设置一些默认标头)

using (var client = new HttpClient())
{
      client.BaseAddress = new Uri(url);
      client.DefaultRequestHeaders.Accept.Clear();
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

      string stringFromObject = JsonConvert.SerializeObject(product);
      HttpContent content = new StringContent(stringFromObject, Encoding.UTF8, "application/json");
      content.Headers.Add("YourCustomHeader", "YourParameter");

      HttpResponseMessage response = client.PostAsync(url, content).Result;
      if (response.IsSuccessStatusCode)
      {
          // do something
      }
 }

更新2(编码): 详细说明编码注释:当然你应该逃避引用和喜欢。但这是Json标准的一部分,应由常见的编码器/解码器处理。最重要的是,您可以对序列化对象的属性使用任何进一步的编码。例如,字符串上的HTML编码和二进制属性上的Base64。只要您知道接收它的网络服务器将正确解码它。

{ 
  "id": 3,
  "title": "Decode this",
  "description": "this is < HTML encoded >",
  "profileImgBase64": "Nzg5MzQ4IHdleWhmQVMmKihFJiphc3R5WUdkdCphc14qVHlpZg0K"
}

因此编码单个属性,但不编码整个Json有效负载,因为您必须在接收管道的开头解码它,而不是Web服务器会理解的东西。