【问题标题】:Send JSON data in http post request C#在http post请求C#中发送JSON数据
【发布时间】:2021-08-09 23:45:00
【问题描述】:

我正在尝试以 JSON 格式发送一个 http post 请求,应该如下所示:

{ 
"id":"72832",
"name":"John"
}

我已经尝试像下面那样做,但如果我是正确的,这不是以 json 格式发送请求。

var values = new Dictionary<string,string>
{
    {"id","72832"},
    {"name","John"}
};

using (HttpClient client = new HttpClient())
{
    var content = new FormUrlEncodedContent(values);
    HttpResponseMessage response = await client.PostAsync("https://myurl",content);
    // code to do something with response
}

如何修改代码以json格式发送请求?

【问题讨论】:

    标签: c# json post httprequest


    【解决方案1】:

    试试这个

    using (var client = new HttpClient())
    {
    var contentType = new MediaTypeWithQualityHeaderValue("application/json");
    var baseAddress = "https://....";
    var api = "/controller/action";
    client.BaseAddress = new Uri(baseAddress);
    client.DefaultRequestHeaders.Accept.Add(contentType);
    
    var data = new Dictionary<string,string>
    {
        {"id","72832"},
        {"name","John"}
    };
    
    var jsonData = JsonConvert.SerializeObject(data);
    var contentData = new StringContent(jsonData, Encoding.UTF8, "application/json");
    
    var response = await client.PostAsync(api, contentData);
    
      if (response.IsSuccessStatusCode)
      {
      var stringData = await response.Content.ReadAsStringAsync();
      var result = JsonConvert.DeserializeObject<object>(stringData);
      }
    }
    

    更新

    如果请求返回 Json 数据,格式为 `

     { "return":"8.00", "name":"John" }
    

    你必须创建结果模型

    public class ResultModel
    {
      public string Name {get; set;}
      public double Return {get; set;}
    }
    

    代码将是

    if (response.IsSuccessStatusCode)
      {
      var stringData = await response.Content.ReadAsStringAsync();
      var result = JsonConvert.DeserializeObject<ResultModel>(stringData);
       
      var value=result.Return;
      var name=Result.Name;
    
      }
    

    【讨论】:

    • 感谢您的回复!如果请求返回 Json 数据,格式为 ```` { "return":"8.00", "name":"John" } ```` 我如何访问关联的值以返回(在这种情况下) 8.00") 并将其存储为字符串?
    • 代码没有按预期工作-当我调试代码时,var json 数据如下所示:"{\"id\":\"72832\",\"name\": \"John\"}" 然后 contentData 似乎没有采用正确的形式,它的值是 {System.Net.Http.StringContent} 并且里面是标题,静态成员和非公共成员 - 我可以'似乎在 contentData 中的任何地方都找不到我的 jsondata
    • @SJ9991 有什么问题?你不应该关心内容是什么样的,你检查过 API 里面的值吗?这段代码被很多人多次使用,没有人有任何问题。
    • 代码在 var response = ...PostAsync(..) 阶段失败,当我调试代码时,jsonData 看起来是正确的形式,这就是为什么我认为它可能是内容数据。当我将错误捕获为 Exception ex 时,在 ExceptionState 中显示“无法评估表达式,因为代码已优化或本机框架位于调用堆栈顶部”,HResult 为 -2146233040
    • 你调用 PostAsync 时的 url 是什么?它可能是错误的 url 或 API 错误。你也可以发布你的 API 吗?
    【解决方案2】:

    我将从使用 RestSharp 开始。

    dotnet add package RestSharp
    

    然后你可以像这样发送请求:

    public async Task<IRestResult> PostAsync(string url, object body)
    {
        var client = new RestClient(url);
        client.Timeout = -1;
    
        var request = new RestRequest(Method.Post);
        request.AddJsonBody(body);
    
        var response = await client.ExecuteAsync(request);
        return response;
    }
    

    只需将您的字典作为正文对象传递 - 我建议创建一个 DTOS 类来发送。

    然后您可以获得返回的 RestResponse 对象的某些方面,例如:

    var returnContent = response.Content;
    var statusCode = response.StatusCode;
    

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多