【问题标题】:How to send json to web api?如何将 json 发送到 web api?
【发布时间】:2015-05-06 20:14:35
【问题描述】:

我想将 json 从 MVC 应用程序中的控制器提交到 Web API 应用程序。

在 Web API 应用程序中,控制器方法之一采用字符串:

//In ValuesController.cs
[HttpGet("{myjson}")]
public string Index (string myjson) {
  ...
}

如果我尝试 url http://localhost/api/values/testing,它将进入:

[HttpGet("{id}")]
public string Get (int id) {
 ...
}

这也在 ValuesController.cs 中。

任何想法为什么第一种方法没有触发?

【问题讨论】:

  • 当你想发送类似 json 的东西时,通常你 post。不过,我不太确定我是否理解您的问题。如果您正确地为方法分配属性,您可以反序列化(使用 json.net)到您的类对象中。
  • 为什么不直接将其作为C# 类传递,而不是创建JSON 对象,然后将其传递给采用c# 类的web api?

标签: c# asp.net-mvc asp.net-web-api


【解决方案1】:

您可以在查询字符串上构建一个包含MyClass 属性的 URL,并使用 HttpClient(或 RestSharp 等第三方选项)调用远程客户端。

此外,您需要使用 [FromUri] 标记您的 WebAPI 端点方法,以便它知道从查询字符串而不是请求正文中期待一个复杂类型。

[HttpGet("/")]
public string Index ([FromUri] MyClass aclass) {
    ...
}

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

    var url = String.Format("api/ControllerName?ID={0}&Dept={1}", 
        myModel.ID, myModel.Dept);

    HttpResponseMessage response = await client.GetAsync(url);
    if (response.IsSuccessStatusCode)
    {
        MyModel model = await response.Content.ReadAsAsync<MyModel>();
    }
}

在这种特殊情况下,您实际上不需要创建 JSON 字符串,因为您可以在查询字符串上传递所有必需的数据。如果不想暴露数据,可以考虑改成post,此时可以直接post对象。

...
response = await client.PostAsJsonAsync(url, myModel);
...

【讨论】:

    【解决方案2】:

    查看Json.NET by Newtonsoft。如果您将端点更改为接受Stream,我认为您可以执行以下操作:

    var myClass = new JsonSerializer()
                      .Deserialize<MyClass>(
                        new JsonTextReader(
                          new StreamReader(stream, Encoding.UTF8, false, 1, true)));
    

    【讨论】:

      【解决方案3】:

      您可以使用库将 JSON 序列化和反序列化为对象。 Json.NET 非常擅长这样做。

      【讨论】:

        【解决方案4】:

        您可以使用简单的 RestSharp 客户端:http://restsharp.org

        var client = new RestClient(" http://localhost/api/values");
        var request = new RestRequest("", Method.POST);
        request.RequestFormat = DataFormat.Json;
        request.AddBody(new { Name = "Miroslav" });
        RestResponse response = client.Execute(request);
        

        我没有掌握你的控制器结构,但你可以更新这个例子。

        文档:https://github.com/restsharp/RestSharp/wiki

        【讨论】:

          猜你喜欢
          • 2017-04-07
          • 2012-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-08
          相关资源
          最近更新 更多