首页 > 技术文章 > WEB API中put post get delete的用法

beekc 2020-04-29 07:24 原文

Post发送数据数据到api

为了模仿数据库 我们在bookcontroller.cs中添加一个静态列表

public static List<Book> books = new List<Book>();

添加静态列表前先添加一个Book实体类

public class Book

    {

        public int ID { set; get; }

        public string Name { set; get; }

    }

然后我们添加一个 Action 用来处理HttpPost请求,下面的代码是带有用户页面跳转功能,不需要可以删了。

public HttpResponseMessage Post(Book book)
        {
            books.Add(book);
 
            //成功添加后 跳转到详情页
            var local = new Uri(this.Request.RequestUri, "book/" + book.ID);
            var response = this.Request.CreateResponse(HttpStatusCode.Created);
            response.Headers.Location = local;
            return response;
        }

接下来就是运行这个API接口

打开PostMan工具模拟客户端向服务器端发送数据,以表单的形式添加一个book

这里的数据是我们刚刚从客户端获取的,要是在真正链接数据库,数据就会存到数据库,像手机APP注册成功后,数据库就会添加记录

 

Get获取数据到客户端

再添加一个 Action 用来处理HttpPost请求

public string Get(int id)
{
            var book = books.FirstOrDefault(m=>m.ID==id);
            return book.Name;
}

在有数据的情况,用PostMan工具向api接口获取数据。这里查询列表的ID=3,返回的值为D喜羊羊

现在我们如果访问的id不存在的数据则会报错,我们希望返回一个404的状态码 为了实现这个,WEB API提供一个HttpResponseException类,HttpStatusCode.NotFound表示页面不存在

public string Get(int id)
{
     var book = books.FirstOrDefault(m => m.ID == id);
    if (book == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    return book.Name;
}

访问不存在的数据

{
    "Message": "出现错误。",
    "ExceptionMessage": "未将对象引用设置到对象的实例。",
    "ExceptionType": "System.NullReferenceException",
    "StackTrace": "   在 APIDemo.Controllers.BookController.Get(Int32 id) 位置 C:\\Users\\Administrator\\Desktop\\C#\\APIDemo\\APIDemo\\Controllers\\BookController.cs:行号 30\r\n   在 lambda_method(Closure , Object , Object[] )\r\n   在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass6_2.<GetExecutor>b__2(Object instance, Object[] methodParameters)\r\n   在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n   在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- 引发异常的上一位置中堆栈跟踪的末尾 ---\r\n   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   在 System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()\r\n--- 引发异常的上一位置中堆栈跟踪的末尾 ---\r\n   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   在 System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()\r\n--- 引发异常的上一位置中堆栈跟踪的末尾 ---\r\n   在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   在 System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"
}

 

访问没有数据,被抛出异常了

Delete

DELETE 的方法发送到 api/values/5,public void Delete(int id) 其中这个id 是直接从url地址中获取

Put

public void Put(int id, [FromBody]string value),其中id从url获取 value从表单中获取,有key值的放在在id,没有值的放在value。

 

推荐阅读