阅读背景:

restful开发接口案例

来源:互联网 
应用Django开发REST 接口
我们以在Django框架中应用的图书豪杰案例来写一套支撑图书数据增删改查的REST API接口,来懂得REST API的开发。

在此案例中,前后端均发送JSON格局数据。

# views.py

from datetime import datetime

class BooksAPIVIew(View):
    """
    查询所有图书、增长图书
    """
    def get(self, request):
        """
        查询所有图书
        路由:GET /books/
        """
        queryset = BookInfo.objects.all()
        book_list = []
        for book in queryset:
            book_list.append({
                "id": book.id,
                "btitle": book.btitle,
                "bpub_date": book.bpub_date,
                "bread": book.bread,
                "bcomment": book.bcomment,
                "image": book.image.url if book.image else ""
            })
        return JsonResponse(book_list, safe=False)

    def post(self, request):
        """
        新增图书
        路由:POST /books/ 
        """
        json_bytes = request.body
        json_str = json_bytes.decode()
        book_dict = json.loads(json_str)

        # 此处详细的校验参数省略

        book = BookInfo.objects.create(
            btitle=book_dict.get("btitle"),
            bpub_date=datetime.strptime(book_dict.get("bpub_date"), "%Y-%m-%d").date()
        )

        return JsonResponse({
            "id": book.id,
            "btitle": book.btitle,
            "bpub_date": book.bpub_date,
            "bread": book.bread,
            "bcomment": book.bcomment,
            "image": book.image.url if book.image else ""
        }, status=201)


class BookAPIView(View):
    def get(self, request, pk):
        """
        获得单个图书信息
        路由: GET  /books/<pk>/
        """
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)

        return JsonResponse({
            "id": book.id,
            "btitle": book.btitle,
            "bpub_date": book.bpub_date,
            "bread": book.bread,
            "bcomment": book.bcomment,
            "image": book.image.url if book.image else ""
        })

    def put(self, request, pk):
        """
        修正图书信息
        路由: PUT  /books/<pk>
        """
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)

        json_bytes = request.body
        json_str = json_bytes.decode()
        book_dict = json.loads(json_str)

        # 此处详细的校验参数省略

        book.btitle = book_dict.get("btitle")
        book.bpub_date = datetime.strptime(book_dict.get("bpub_date"), "%Y-%m-%d").date()
        book.save()

        return JsonResponse({
            "id": book.id,
            "btitle": book.btitle,
            "bpub_date": book.bpub_date,
            "bread": book.bread,
            "bcomment": book.bcomment,
            "image": book.image.url if book.image else ""
        })

    def delete(self, request, pk):
        """
        删除图书
        路由: DELETE /books/<pk>/
        """
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)

        book.delete()

        return HttpResponse(status=204)
# urls.py

urlpatterns = [
    url(r"^books/$", views.BooksAPIVIew.as_view()),
    url(r"^books/(?P<pk>\d+)/$", views.BookAPIView.as_view())
]
测试
应用Postman测试上述接口

1) 获得所有图书数据

GET 方法拜访 https://127.0.0.1:8000/books/, 返回状况码200,数据以下

[
    {
        "id": 1,
        "btitle": "射雕豪杰传",
        "bpub_date": "1980-05-01",
        "bread": 12,
        "bcomment": 34,
        "image": ""
    },
    {
        "id": 2,
        "btitle": "天龙八部",
        "bpub_date": "1986-07-24",
        "bread": 36,
        "bcomment": 40,
        "image": ""
    },
    {
        "id": 3,
        "btitle": "笑傲江湖",
        "bpub_date": "1995-12-24",
        "bread": 20,
        "bcomment": 80,
        "image": ""
    },
    {
        "id": 4,
        "btitle": "雪山飞狐",
        "bpub_date": "1987-11-11",
        "bread": 58,
        "bcomment": 24,
        "image": ""
    },
    {
        "id": 5,
        "btitle": "西游记",
        "bpub_date": "1988-01-01",
        "bread": 10,
        "bcomment": 10,
        "image": "booktest/xiyouji.png"
    },
    {
        "id": 6,
        "btitle": "水浒传",
        "bpub_date": "1992-01-01",
        "bread": 10,
        "bcomment": 11,
        "image": ""
    },
    {
        "id": 7,
        "btitle": "红楼梦",
        "bpub_date": "1990-01-01",
        "bread": 0,
        "bcomment": 0,
        "image": ""
    }
]
2)获得单一图书数据

GET 拜访 https://127.0.0.1:8000/books/5/ ,返回状况码200, 数据以下

{
    "id": 5,
    "btitle": "西游记",
    "bpub_date": "1988-01-01",
    "bread": 10,
    "bcomment": 10,
    "image": "booktest/xiyouji.png"
}
GET 拜访https://127.0.0.1:8000/books/100/,返回状况码404

3)新增图书数据

POST 拜访https://127.0.0.1:8000/books/,发送JSON数据:

{
    "btitle": "三国演义",
    "bpub_date": "1990-02-03"
}
返回状况码201,数据以下

{
    "id": 8,
    "btitle": "三国演义",
    "bpub_date": "1990-02-03",
    "bread": 0,
    "bcomment": 0,
    "image": ""
}
4)修正图书数据

PUT 拜访https://127.0.0.1:8000/books/8/,发送JSON数据:

{
    "btitle": "三国演义(第二版)",
    "bpub_date": "1990-02-03"
}
返回状况码200,数据以下

{
    "id": 8,
    "btitle": "三国演义(第二版)",
    "bpub_date": "1990-02-03",
    "bread": 0,
    "bcomment": 0,
    "image": ""
}
5)删除图书数据

DELETE 拜访https://127.0.0.1:8000/books/8/,返回204状况码应用Django开发REST 接口
我们以在Django框架中应用的图书豪杰案例来写一套支撑图书数



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: