【问题标题】:How to Consume API GET method that accepts FromBody parameter [duplicate]如何使用接受 FromBody 参数的 API GET 方法
【发布时间】:2019-07-22 12:01:56
【问题描述】:

如何在 C# 中使用接受一个 FromUri 参数和第二个 FromBody 参数的 Web API 2 GET 命令。我不知道如何在 GET 命令中发送正文,我需要使用 POST 命令吗?但如何?下面是我到目前为止写的代码。谢谢你。

API 代码

[HttpGet]
[ResponseType(typeof(IEnumerable<Student>))]
public IHttpActionResult Find([FromUri]string searchText,[FromBody]SearchType searchType)
{
    //EF code to get data from DB
    using (handler)
    {
        return Ok(handler.Find(searchText, searchType));
    }

}

HttpClient 代码

static void Main(string[] args)
{

     HttpClient client = new HttpClient();
     client.BaseAddress = new Uri("http://localhost:55587/");
     client.DefaultRequestHeaders.Accept.Clear();
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

     string aSearchText ="John";
     SearchType aSearchType = SearchType.Name; //this is enum

     Task<HttpResponseMessage> responseTask = client.GetAsync($"api/Student/{aSearchText}");
     responseTask.Wait();

     ////////////////////
     /// Code missing how to send "aSearchType" as a body in Get Command?
     ////////////////////

     var ListTask = responseTask.Content.ReadAsAsync<IEnumerable<Student>>();
     ListTask.Wait();

     IEnumerable<Student> list = ListTask.Result;

     foreach(Student s in list)
     {
         Console.WriteLine(s.Name);
     }
}

【问题讨论】:

标签: c# asp.net-web-api2 httpclient


【解决方案1】:

您可以将参数从 body 传递给 HttpGet 操作,但这不合逻辑。

您可以使用 HttpPost 从正文发送数据。

[HttpPost]
[ResponseType(typeof(IEnumerable<Student>))]
public IHttpActionResult Find([FromBody]SearchType searchType,[FromUri]string searchText)
{
    //EF code to get data from DB
    using (handler)
    {
        return Ok(handler.Find(searchText, searchType));
    }

}
string aSearchText ="John";
     SearchType aSearchType = SearchType.Name; //this is enum

     Task<HttpResponseMessage> responseTask = client.PostAsJsonAsync($"api/Student/{aSearchText}",aSearchType );
     responseTask.Wait();

【讨论】:

  • "您不能将参数从正文传递到 HttpGet 操作。"。事实上你可以。规范没有被禁止。它只是建议你不要。我相信弹性搜索使用这个原理进行大查询。任何 http 方法都可以有消息体。
  • @xdtTransform 如何将数据从 body 发送到 get 方法?
  • @xdtTransform 感谢您的指导。你可以在编程中做任何事情!但这在 httpget 中从 body 发送数据是不合逻辑的
  • 即使是罗伊。菲尔丁(也就是在 Http 和 Rest 上首先签署每个 RFC 的家伙)主张我们不应该这样做。所以我同意你的看法。他应该使用 http Post。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
相关资源
最近更新 更多