商店应用中使用,第十二章

作者: 化工塑胶  发布:2019-11-12

前边风流倜傥篇大家介绍了 Office 365 REST API 的合法工具的使用,本篇大家来看一下 SharePoint REST API 本人的叙说、结商谈利用形式,以致部分用到涉世。

  1. SharePoint 2013使用_api来标记出 REST SE兰德揽胜VICE,REST Service其实是 client.svc web service的一片段,但为了简化 REST U奔驰M级I的构造以至缩小REST UPRADOI的长度,使用 _api 来替代 _vti_bin/client.svc,比方, 你能够动用  来替代  _api 惯例;可参考此文章中的 Reference the SharePoint 2013 REST service in your endpoint URI 章节;

书本出处:
原作者:Antonio Melé

第一来看看SharePoint REST API 的概述:

SharePoint 2013 REST Syntax Posters.pdf

(译者注:第十三章,全书最终风流浪漫章,终于到那章了。卡塔 尔(英语:State of Qatar)

      REST API 服务是在 SharePoint 2012 中被引进的,官方感到 REST API 服务能够比美于现存的 SharePoint 客商端对象模型。开垦职员能够动用此外协理REST Web 央浼的技术(C#,javascript,java,oc 等等卡塔尔国以长途方式与 SharePoint 数据进行相互影响。那也就代表,开荒人士能够选拔 REST Web手艺和规范开放数据契约(OData卡塔尔语法从其 SharePoint 相关应用程序、技术方案和客商端应用程序实践 CRUD 操作。而目的性中长途 Web 或活动使用,必得先拿到访谈权限,本领接受 SharePoint 数据财富。

工具:Chrome浏览器中的 Advanced Rest Client Application插件

第十五章

     在 REST API 现身早前,我们供给经过 client.svc 那一个 WCF 服务来呼吁SharePoint 的列表数据,况且仅限于获取数据。数据的修正并从未在此个服务中反映。而通过 REST API,大家能够实现前边提到的 CRUD 操作:使用OData 规范组织可完毕REST 的 HTTP 诉求,对应到相应的号令方法,就足以对该能源举行读取或操作了。举个例子使用 GET 方法拿到数据,使用 POST 方法来创立数量,使用 PUT 或 ME福特ExplorerGE 方法来更新数据,使用 DELETE 方法来删除数据。

 

营造一个API

在上黄金年代章中,你营造了三个学员登记系统和科目报名。你成立了用来显示课程内容的视图以致怎么样选拔Django的缓存框架。在这里章中,你将学习怎么做到以下几点:

  • 构建三个 RESTful API
  • 用API视图操作认证和权限
  • 始建API视图放置和路由

      REST API 私下认可会再次回到 Atom 格式的多少,然则我们也得以依照供给设定重返 JSON 格式的数据。小编个人更赏识管理 JSON 格式,JSON 数据转换为 C# 的对象,有一个很棒的网址:。通过那几个网址,大家能够把 JSON 数据直接转变为 C# 对象,节省了成都百货上千编纂 C# 基本功代码的时间。

  1. Search REST API的query(GET)能够设置重回json格式的结果,存款和储蓄在data.d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results中,results是个数据集合,序号从0开始;

  2. 动用REST API获取(GET)数据时,若重回多条记下,则再次回到值存款和储蓄在data.d.results中,results是个数据集结,序号从0伊始,每一个result包罗叁个目的单元音信,举例:二个List Item的全体属性,如代码所示;若重临单条记录,则再次回到值存款和储蓄在data.d中;

构建叁个RESTful API

你只怕想要创制二个接口给任何的劳务来与您的web应用交互作用。通过创设二个API,你能够允许第三方来费用音信以至程序化的操作你的应用程序。

您可以经过广大措施结合你的API,可是大家最勉励你遵守REST原则。REST种类结构来自Representational State Transfer。RESTful API是依据财富的(resource-based卡塔尔。你的模型代表财富和HTTP方法举例GET,POST,PUT,以至DELETE是被用来收复,创设,更新,以致去除对象的。HTTP响应代码也能够在前后文中使用。分歧的HTTP响应代码的回来用来提示HTTP需要的结果,比方,2XX响应代码用来表示成功,4XX表示错误,等等。

在RESTful API中最通用的置换数据是JSON和XML。我们就要为大家的品类创设一个JSON系列化的REST API。我们的API会提供以下职能:

  • 收获科目
  • 获得可用的教程
  • 赢得课程内容
  • 学科报名

俺们能够透过创设定制视图从Django最初营造叁个API。当然,有为数不菲第三方的模块能够给你的花色轻便的创导二个API,个中最盛名的正是Django Rest Framework。

接下去大家来探视 REST API 的协会组成:

图片 1图片 2

安装Django Rest Framework

Django Rest Framework允许你为您的花色便利的营造REST APIs。你能够透过会见 http://www.django-rest-framework.org 找到全体REST Framework新闻。

开辟shell然后因此以下命令安装那个框架:

pip install djangorestframework=3.2.3

编辑educa项目的settings.py文件,在INSTALLED_APPS安装中增添rest_framework来激活那几个应用,如下所示:

INSTALLED_APPS = (
       # ...
       'rest_framework',
   )

以后,加多如下代码到settings.py文件中:

REST_FRAMEWORK = {
       'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
       ]
}

你可以行使REST_FRAMEWORK设置为您的API提供贰个点名的布置。REST Framework提供了叁个科学普及的安装去陈设暗许的表现。DEFAULT_PERMISSION_CLASSES布署钦定了去读取,创立,更新恐怕去除对象的暗许权限。大家设置DjangoModelPermissionsOrAnonReadOnly作为唯生龙活虎的默许权限类。那一个类依赖与Django的权柄系统允许客商去创设,更新,恐怕去除对象,同时提供只读的探问给素不相识人客户。你会在那后学习更加的多关于权限的上边。

假使要找到三个完璧归赵的REST框架可用设置列表,你能够访谈 。

      端点的基本U福特ExplorerL是: ,它是独具 SharePoint REST API 的底子,个中 server 代表服务器的称号,site 代表一定网址的称呼只怕路线。

{
"__metadata":{"id":"b719e719-e4cc-445c-9c7c-0250aba4338a",
"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)",
"etag":""4"","type":"SP.Data.TasksListItem"},
"FirstUniqueAncestorSecurableObject":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/FirstUniqueAncestorSecurableObject"}},
"RoleAssignments":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/RoleAssignments"}},
"AttachmentFiles":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/AttachmentFiles"}},
"ContentType":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/ContentType"}},
"FieldValuesAsHtml":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/FieldValuesAsHtml"}},
"FieldValuesAsText":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/FieldValuesAsText"}},
"FieldValuesForEdit":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/FieldValuesForEdit"}},
"File":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/File"}},
"Folder":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/Folder"}},
"ParentList":{"__deferred":{"uri":"https://gjq-11683d04060f3b.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'b44e6daf-ee1e-4249-987f-2f9305cdc884')/Items(1)/ParentList"}},
"FileSystemObjectType":0,
"Id":1,
"ContentTypeId":"0x0108005943A401D04CAD47AE81ABAA54AA39A3",
"Title":"Test",
"PredecessorsId":{"__metadata":{"type":"Collection(Edm.Int32)"},"results":[]},
"Priority":"(2) Normal",
"Status":"Not Started",
"PercentComplete":0.79,
"AssignedToId":11,
"TaskGroupId":null,
"Body":"<div></div>",
"StartDate":"2014-08-10T16:00:00Z",
"DueDate":"2014-08-27T16:00:00Z",
"RelatedItems":null,
"WorkflowLink":null,
"OffsiteParticipant":null,
"OffsiteParticipantReason":null,
"WorkflowOutcome":null,
"WorkflowName":null,
"GUID":"2c618f60-7fae-4689-a652-52458ae60dd6",
"ID":1,
"Modified":"2014-08-12T03:41:59Z",
"Created":"2014-08-11T01:57:18Z",
"AuthorId":11,
"EditorId":11,
"OData__UIVersionString":"4.0",
"Attachments":false
}

概念体系化器

安装好REST Framework之后,大家必要钦赐大家的多大校会怎样类别化。输出的多寡必得被系列化成钦命的格式,並且输出的数据将会给进度去体系化。REST框架提供了以下类来给单个对象去创设体系化:

  • Serializer:给日常的Python类实例提供体系化。
  • ModelSerializer:给模型实例提供类别化。
  • HyperlinkedModelSerializer:类似与ModelSerializer,不过代表与链接实际不是主键的对象关联。

让大家营造大家的首先个类别化器。在courses采取目录下创造以下文件结构:

api/
    __init__.py
    serializers.py

小编们将会在api目录中营造具备的API作用为了维持总体都有爱不忍释的协会。编辑serializeers.py文件,然后增多以下代码:

from rest_framework import serializers
from ..models import Subject

class SubjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject
        fields = ('id', 'title', 'slug')

上述是给Subject模型使用的种类化器。体系化器以风华正茂种类似的主意被定义给Django
FromModelForm类。Meta类允许你去钦点模型类别化以至给类别化蕴涵的字段。全数的模子字段都会被含宛如果你从未安装两个fields属性。

让我们尝试大家的类别化器。张开命令行通过`python manage.py shell*开始Django shell。运行以下代码:

from courses.models import Subject
from courses.api.serializers import SubjectSerializer
subject = Subject.objects.latest('id')
serializer = SubjectSerializer(subject)
serializer.data

在上头的例证中,我们获得了三个Subject指标,创制了三个SubjectSerializer的实例,而且访谈体系化的数目。你会收获以下输出:

{'slug': 'music', 'id': 4, 'title': 'Music'}

如您所见,模型数据被调换来了Python的数据类型。

      借使要拜望特定的网址集,U卡宴L是:https://server/site/_api/site,假如要寻访特定的网址,USportageL则是:https://server/site/_api/web 。那三种是最常用的 API ,还或者有两种 API 能实现部分特定的功用,如:使用寻找服务:https://server/site/_api/search,访谈客商配置文件:http://server/site/_api/SP.UserProfiles.PeopleManager 等。

View Code

打探解析器和渲染器

在你在三个HTTP响应中回到类别化数据之前,这么些种类化数据必得运用内定的格式举办渲染。相通的,当您获得二个HTTP供给,在您利用那么些数额操作此前你必得拆解解析传入的数码同临时候反类别化这一个数据。REST Framework包括渲染器和深入分析器来执行以上操作。

让大家看下怎么着剖判传入的数目。赋予贰个JSON字符串输入,你能够利用REST创维提供的JSONParser类来扭转它产生三个Python对象。在Python shell中试行以下代码:

from io import BytesIO
from rest_framework.parsers import JSONParser
data = b'{"id":4,"title":"Music","slug":"music"}'
JSONParser().parse(BytesIO(data))

您将会得到以下输出:

{'id': 4, 'title': 'Music', 'slug': 'music'}

REST Framework还包含Renderer类,该类允许你去格式化API响应。框架会侦察通过的剧情使用的是哪类渲染器。它对响应进行自己议论,依据央浼的Accept头去预判内容的类型。除此以外,渲染器能够因此U昂CoraL的格式后缀进行预判。譬喻,访谈将会出发JSONRenderer为了再次来到二个JSON响应。

回来shell中,然后试行以下代码去从提供的种类化器例子中渲染serializer对象:

from rest_framework.renderers import JSONRenderer
JSONRenderer().render(serializer.data)

您会看出以下输出:

b'{"id":4,"title":"Music","slug":"music"}'

咱俩选取JSONRenderer去渲染体系化数据为JSON。暗许的,REST Framework使用二种差别的渲染器:JSONRendererBrowsableAPIRenderer。后面一个提供叁个web接口可以方便的浏览你的API。你能够透过REST_FRAMEWORK设置的DEFAULT_RENDERER_CLASSES筛选退换暗许的渲染器类。

您能够找到越多关于渲染器和深入剖判器的新闻经过造访 以及 http://www.django-rest- framework.org/api-guide/parsers/ 。

      上面我们以特定网址为例,来看一下 REST API 能产生哪些不足为道操作:

  1. 接纳REST API的局地提出:

创设列表和实际情况视图

REST Framework自姜豆蔻梢头组通用视图和mixins,你能够用来构建你协调的API。它们提供了得到,创造,更新以致去除模型对象的职能。你能够看来有着REST Framework提供的通用mixins和视图,通过访问 。

让大家成立列表和详细的情况视图去取回Subject对象们。在courses/api/目录下创办叁个新的文件并取名称为views.py。增添如下代码:

from rest_framework import generics
from ..models import Subject
from .serializers import SubjectSerializer

class SubjectListView(generics.ListAPIView):
    queryset = Subject.objects.all()
    serializer_class = SubjectSerializer

class SubjectDetailView(generics.RetrieveAPIView):
    queryset = Subject.objects.all()
    serializer_class = SubjectSerializer

在此串代码中,我们选取REST Framework提供的ListAPIViewRetrieveAPIView视图。大家给授予的首要值富含了八个pk U奥迪Q5L参数给详细情形视图去取回对象。八个视图都有以下属性:

  • queryset:根基查询集用来收复对象。
  • serializer_class:那个类用来体系化对象。

让大家给我们的视图增添UXC60L形式。在courses/api/目录下成立新的文本并取名称叫urls.py并使之看上去如下所示:

from django.conf.urls import url
from . import views

urlpatterns = [
       url(r'^subjects/$',
           views.SubjectListView.as_view(),
           name='subject_list'),
       url(r'^subjects/(?P<pk>d+)/$',
           views.SubjectDetailView.as_view(),
           name='subject_detail'),
]

编辑educa种类的主urls.py文件同时带有以下API形式:

urlpatterns = [
    # ...
    url(r'^api/', include('courses.api.urls', namespace='api')),
]

咱俩给大家的API URubiconLs使用api命名空间。确认保证您的服务器已经通过命令python manange.py runserver运转。张开shell然后通过cURL获取URL 如下所示:

$ curl http://127.0.0.1:8000/api/subjects/

您会得到相似以下的响应:

[{"id":2,"title":"Mathematics","slug":"mathematics"},{"id":4,"title":"Music","slug":"music"},{"id":3,"title":"Physics","slug":"physics"},{"id":1,"title":"Programming","slug":"programming"}]

以此HTTP响应包罗JSON格式的三个Subject对象列。假使您的操作系统未有安装过cURL,你可还足以应用别的的工具去发送定制HTTP诉求比方二个浏览器扩展Postman ,那几个扩充你能够在 https://www.getpostman.com 找到。

在你的浏览器中打开 。你会见到如下所示的REST Framework的可浏览API:

图片 3

这个HTML界面由BrowsableAPIRenderer渲染器提供。它展现了结果头和剧情还要同意实践央求。你还是能够在U瑞虎L富含贰个Subject指标的id来寻访该目的的API详细情形视图。在你的浏览器中伸开 。你将会见到贰个独立的渲染成JSON格式的Subject对象。

      (1卡塔尔国对列表和列表项的操作

  • If you’re not using the cross-domain library, include an X-RequestDigest header to send the form digest value in all POST requests and a content-lengthheader for POST requests that send data in the request body.

  • If you're not making cross-domain requests, remove SP.AppContextSite(@target) and ?@target='<host web url>' from the endpoint URI.

  • If you’re using OAuth, include an Authorization header ("Authorization": "Bearer " + <access token>) to send the OAuth access token.

  • If you want the server to return responses in Atom format, remove the "accept": "application/json; odata=verbose" header.

始建嵌套的种类化

我们就要给Course模型创制三个种类化。编辑api/serializers.py文件并增加以下代码:

from ..models import Course

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ('id', 'subject', 'title', 'slug', 'voerview',
                  'created', 'owner', 'modules')

让我们看下四个Course目的是如何被类别化的。张开shell,运营python manage.py shell,然后运营以下代码:

from rest_framework.renderers import JSONRenderer
from courses.models import Course
from courses.api.serializers import CourseSerializer
course = Course.objects.latest('id')
serializer = CourseSerializer(course)
JSONRenderer().render(serializer.data)

你将会透过大家富含在CourseSerializer中的字段获取到叁个JSON对象。你能够看来modules管理器的被波及对象呗连串化成一列第意气风发值,如下所示:

"modules": [17, 18, 19, 20, 21, 22]

我们想要满含个多的消息有关每三个模块,所以大家必要类别化Module指标以致嵌套它们。更正api/serializers.py文件提供的代码,使之看上去如下所示:

from rest_framework import serializers
from ..models import Course, Module

class ModuleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Module
        fields = ('order', 'title', 'description')

class CourseSerializer(serializers.ModelSerializer):
    modules = ModuleSerializer(many=True, read_only=True)
    class Meta:
        model = Course
        fields = ('id', 'subject', 'title', 'slug', 'overview',
                    'created', 'owner', 'modules')

我们给Module模型定义了多少个ModuleSerializer去提供体系化。之后大家增添一个modules属性给CourseSerializer去嵌套ModuleSerializer连串化器。我们设置many=True去注脚大家正在类别化四个对象。read_only参数申明那几个字段是只读的还要不得以被含有在此外输入中去创建只怕晋级对象。

打开shell况且再一次成立叁个CourseSerializer的实例。使用JSONRenderer渲染连串化器的data本性。那叁次,被排列的模块会被通过嵌套的ModuleSerializer连串化器给种类化,如下所示:

"modules": [
        {
           "order": 0,
           "title": "Django overview",
           "description": "A brief overview about the Web Framework."
        }, 
        {
            "order": 1,
            "title": "Installing Django",
            "description": "How to install Django."
        },
        ... 
]

您能够找到更加的多关于连串化器的剧情,通过拜见 。

       列表:

  1. 应用REST API获取对象消息时,只好取获得当前等第音信,形似于Client Object Model,比如 /_api/web/lists能够收获全部list新闻,但一直不list item的新闻;比方:三个List的持有属性,

营造定制视图

REST Framework提供一个APIView类,那一个类基于Django的View类构建API功能。APIView类与View在使用REST Framework的定制Request以及Response目的时差别,而且操作APIException不等的回来合适的HTTP响应。它还恐怕有三个内建的表达和注明系统去处理视图的访谈。

我们将要创立三个视图给顾客去对学科进行报名。编辑api/views.py文本同有时候增添以下代码:

from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from ..models import Course

class CourseEnrollView(APIView):
    def post(self, request, pk, format=None):
        course = get_object_or_404(Course, pk=pk)
        course.students.add(request.user)
        return Response({'enrolled': True})

CourseEnrollView视图操纵客商对学科实行报名。以上代码解释如下:

  • 我们创制了八个定制视图,是APIView的子类。
  • 我们给POST操作定义了一个post()措施。其余的HTTP方法都不允许放那一个这些视图。
  • 笔者们预测二个pkUTiggoL参数会博涵三个学科的ID。我们经过付与的pk参数获取那个科目,而且只要那么些不设有的话就抛出多个404可怜。
  • 我们抬高当前客商给Course对象的students多对多关系并放回贰当中标响应。

编辑api/urls.py文本同一时间给CourseEnrollView视图增多以下U昂科雷L格局:

url(r'^courses/(?P<pk>d+)/enroll/$',
       views.CourseEnrollView.as_view(),
       name='course_enroll'),

理论上,大家今后可以举办五个POST要求去给当下顾客对一个课程实行报名。但是,我们必要辨认这几个顾客同一时候阻止为证实的客户来拜见那个视图。让大家看下API认证和权杖是什么样行事的。

       URL: URL>/web/lists(guid'<列表 ID>') 或 URL>/web/lists/getbytitle('title of list')

图片 4图片 5

操纵认证

REST Framework提供表明类去辨别客商试行的呼吁。借使证实成功,那么些框架会在request.user中设置验证的User对象。若无顾客被注明,一个Django的AnonymousUser实例会被取代他。

REST Framework提供以下表达后台:

  • BasicAuthentication:HTTP根底认证。顾客和密码会被编写翻译为Base64并被客商端设置在Authorization HTTP头中。你能够学习越多关于它的内容,通过访谈 。
  • TokenAuthentication:基于token的认证。一个Token模型被用来存款和储蓄用户tokens。用来表明的Authorization HTTP头里面装有包罗token的客商。
  • SessionAuthentication:使用Djnago的对话后台(session backend卡塔尔国来验证。这一个后台从您的网址前带给履行认证AJAX央求给API是不行政管理用的。

您能够创设二个通过一而再延续REST Framework提供的BaseAuthentication类的子类甚至重写authenticate()艺术来构建三个定制的申明后台。

您可以在每一种视图的底蕴上安装验证,也许通过DEFAULT_AUTHENTICATION_CLASSES安装为全局认证。

证实只可以停业客商正在试行的乞请。它不大概同意或然组织视图的探问。你必需运用权力去界定视图的拜候。

您能够找到有关认证的装有新闻,通过探问 http://www.django-rest- framework.org/api-guide/authentication/ 。

让大家给我们的视图增添BasicAuthentication。编辑courses应用的api/views.py文件,然后给CourseEnrollView累积二个authentication_classes属性,如下所示:

from rest_framework.authentication import BasicAuthentication

class CourseEnrollView(APIView):
    authentication_classes = (BasicAuthentication,)
    # ...

顾客将会被装置在HTTP央求中的Authorization头里面包车型大巴证书举行甄别。

       列表项集合:

{
"__metadata":
  {
  "id":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')",
  "uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')",
  "etag":""3"",
  "type":"SP.List"
  },
"FirstUniqueAncestorSecurableObject":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/FirstUniqueAncestorSecurableObject"}},
"RoleAssignments":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/RoleAssignments"}},
"ContentTypes":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/ContentTypes"}},
"CreatablesInfo":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/CreatablesInfo"}},
"DefaultView":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/DefaultView"}},
"DescriptionResource":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/DescriptionResource"}},
"EventReceivers":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/EventReceivers"}},
"Fields":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/Fields"}},
"Forms":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/Forms"}},
"InformationRightsManagementSettings":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/InformationRightsManagementSettings"}},
"Items":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/Items"}},
"ParentWeb":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/ParentWeb"}},
"RootFolder":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/RootFolder"}},
"TitleResource":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/TitleResource"}},
"UserCustomActions":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/UserCustomActions"}},
"Views":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/Views"}},
"WorkflowAssociations":{"__deferred":{"uri":"https://gjq-11683d04060f3f.sharepoint.com/BasicOperationApp/_api/Web/Lists(guid'9b64f833-6b28-4bf4-b02d-31e6f1d649e6')/WorkflowAssociations"}},
"AllowContentTypes":true,"BaseTemplate":100,"BaseType":0,"ContentTypesEnabled":false,"CrawlNonDefaultViews":false,"Created":"2014-08-12T05:22:25Z",
"DefaultContentApprovalWorkflowId":"00000000-0000-0000-0000-000000000000",
"Description":"",
"Direction":"none",
"DocumentTemplateUrl":null,
"DraftVersionVisibility":0,
"EnableAttachments":true,
"EnableFolderCreation":false,
"EnableMinorVersions":false,
"EnableModeration":false,
"EnableVersioning":false,
"EntityTypeName":"AccordionList",
"ForceCheckout":false,
"HasExternalDataSource":false,
"Hidden":false,
"Id":"9b64f833-6b28-4bf4-b02d-31e6f1d649e6",
"ImageUrl":"/_layouts/15itgen.png?rev=37",
"IrmEnabled":false,
"IrmExpire":false,
"IrmReject":false,
"IsApplicationList":false,
"IsCatalog":false,
"IsPrivate":false,
"ItemCount":3,
"LastItemDeletedDate":"2014-08-12T05:22:25Z",
"LastItemModifiedDate":"2014-08-13T06:16:41Z",
"ListItemEntityTypeFullName":"SP.Data.AccordionListItem",
"MultipleDataList":false,
"NoCrawl":false,
"ParentWebUrl":"/",
"ParserDisabled":false,
"ServerTemplateCanCreateFolders":true,
"TemplateFeatureId":"00bfea71-de22-43b2-a848-c05709900100",
"Title":"Accordion"
}

给视图加多权限

REST Framework包罗叁个权力系统去节制视图的拜候。一些REST Framework的放置权限如下所示:

  • AllowAny:无界定的走访,无论当前顾客是不是通过认证。
  • IsAuthenticated:只允许通过验证的客户。
  • IsAuthenticatedOrReadOnly:通过认证的顾客具备完整的权限。目生客户只同意去能够接纳可读的不二秘技,举例GET, HEAD只怕OPETIONS。
  • DjangoModelPermissions:权限与django.contrib.auth张开了松绑。视图须求二个queryset质量。唯有分配了模型权限的并通过证实的客商技术得到权限。
  • DjangoObjectPermissions:基于各种对象功底上的Django权限。

要是顾客未有权力,他们平日会拿走以下有些HTTP错误:

  • HTTP 401:无认证。
  • HTTP 403:未有权力。

你可以赢得越来越多的有关权限的音信,通过拜谒 http://www.django-rest- framework.org/api-guide/permissions/ 。

编辑courses应用的api/views.py文本然后给CourseEnrollView增加一个permission_classes属性,如下所示:

from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated

class CourseEnrollView(APIView):
    authentication_classes = (BasicAuthentication,)
    permission_classes = (IsAuthenticated,)
    # ...

大家包罗了IsAuthenticated权力。那些权力将会协会目生客商访谈这一个视图。将来,我们得以之sing八个POST须要给我们的新的API方法。

保障开荒服务器正在运作。张开shell然后运转以下命令:

curl -i –X POST http://127.0.0.1:8000/api/courses/1/enroll/

你将会获得以下响应:

HTTP/1.0 401 UNAUTHORIZED
...
{"detail": "Authentication credentials were not provided."}

如笔者辈所预期的,大家赢得了叁个401 HTTP code,因为我们并未有注明过。让大家带上大家的三个客户打开下幼功认证。运转以下命令:

curl -i -X POST -u student:password http://127.0.0.1:8000/api/courses/1/enroll/

运用七个早就存在的顾客的证书替换student:password。你会获得以下响应:

HTTP/1.0 200 OK
...
{"enrolled": true}

你能够额访谈管理站点然后检查到地方命令中的顾客已经产生了学科的报名。

       URL: URL>/web/lists(guid'<列表 ID>') /items 或 URL>/web/lists/getbytitle('title of list')/items

View Code

创设视图设置和路由

ViewSets同意你去定义你的API的相互并且让REST Framework通过二个Router对象动态的营造UKugaLs。通过动用视图设置,你可避防止给多个视图重复编写相近的逻辑。视图设置包涵标准的创立,获取,更新,删除选项操作,它们是 list(),create(),retrieve(),update(),partial_update()以及destroy()

让我们给Course模型创建二个视图设置。编辑api/views.py文件然后加多以下代码:

from rest_framework import viewsets
from .serializers import CourseSerializer

class CourseViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer

咱俩创造了三个后续ReadOnlyModelViewSet类的子类,被接续的类提供了只读的操作 list()retrieve(),前面叁个用来排列对象,前者用来收复一个独立的目的。编辑api/urls.py文件同一时间给大家的视图设置创造四个路由,如下所示:

from django.conf.urls import url, include
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register('courses', views.CourseViewSet)

urlpatterns = [
    # ...
    url(r'^', include(router.urls)),
]

咱俩创立七个三个DefaultRouter目的并且通过courses前缀注册了我们的视图设置。这么些路由担任给我们的视图动态的生成U福特ExplorerLs。

在你的浏览器中开垦 。你会看出路由排列除了具有的视图设置在它的底工UKoleosL中,如下图所示:

图片 6

你能够访谈 去拿到课程的列表。

您能够学学到跟多关于视图设置的剧情,通过拜谒 。你也得以找到更加多关于路由的音讯,通过拜会 。

      钦定 ID 的列表项:

  1. REST Search API时,私下认可的rowlimit是10,即暗许重返10条记下;

  2. 行使REST API的POST方法成立新剧情时,重返的音讯囤积在data.d中,比方data.d.Id;

  3. REST API 不能够改改文件夹的Name,实际情况请参考此处或者此处;

给视图设置加多额外的操作

你能够给视图设置增添额外的操作。让大家校正大家事先的CourseEnrollView视图成为叁个定制的视图设置操作。编辑api/views.py文本然后改正CourseViewSet类如下所示:

from rest_framework.decorators import detail_route

class CourseViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer
    @detail_route(methods=['post'],
                authentication_classes=[BasicAuthentication],
                permission_classes=[IsAuthenticated])
    def enroll(self, request, *args, **kwargs):
        course = self.get_object()
        course.students.add(request.user)
        return Response({'enrolled': True})

我们增添了八个定制enroll()措施约等于给这几个视图设置的多个格外的操作。以上的代码解释如下:

  • 咱俩应用框架的detail_route装饰器去内定那个类是三个在二个单独对象上被实践的操作。
  • 其黄金年代装饰器允许大家给这些操作增添定制属性。大家钦点那几个视图只同意POST方法,而且安装了表达和权限类。
  • 我们使用self.get_object()去获取Course对象。
  • 我们给students丰盛当前客户的多对多关系并且重临一个定制的功成名就响应。

编辑api/urls.py文件并移除以下U奥迪Q7L,因为我们不再须求它们:

url(r'^courses/(?P<pk>[d]+)/enroll/$',
       views.CourseEnrollView.as_view(),
       name='course_enroll'),

尔后编辑api/views.py文本同期移除CourseEnrollView类。

这一个用来在课程中申请的U途观L今后大器晚成度是由路由动态的成形。这几个U纳瓦拉L保持不改变,因为它使用我们的操作名enroll动态的打开创设。

      URL: URL>/web/lists(guid'<列表 ID>') /items(item id) 或 URL>/web/lists/getbytitle('title of list')/items(item id)

  1. REST API在更新file内容时,只好利用PUT,更新文件的metadata时,必要将文件作为三个item;

    If you want to update a file's metadata, you'll have to construct an endpoint that reaches the file as a list item. You can do this because each folder is also a list, and each file is also a list item. Construct an endpoint that looks like this: https:///_api/web/lists/getbytitle('Documents')/items(). Working with lists and list items with REST explains how to update a list item's metadata.

  2. 动用REST API获取item消息时,Look Up字段会产生一些生成,举个例子:有三个中间名字为Zone的列,查询出来的数码中找不到Zone列,而会有个ZoneId字段,值为被询问item的ID值;即使想获得Zone的来得名称,可利用$expand来获取:

    1. 在$select=中得以写上Zone/Id,Zone/ColumnX;
    2. 在$expand=中必得写上Zone;

      注:Zone为眼下列表的Look up字段;ColumnX为被询问列表的其他字段的里边名称;

创办定制权限

我们想要学子能够访谈他们申请过的科目标内容。只有在这里个科目中申请过的上学的小孩子工夫访问那一个课程的源委。最佳的方法就是通过叁个定制的权限类。Django提供了一个BasePermission类允许你去定制以下效能:

  • has_permission():视图级的权力检查。
  • has_object_permission():实例级的权位检查。

上述方法会重回True来允许访问,相反就能够回来False。在courses/api/中创制一个新的文件并取名叫permissions.py。加多以下代码:

from rest_framework.permissions import BasePermission

class IsEnrolled(BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.students.filter(id=request.user.id).exists()

大家成立了三个连任BasePermission类的子类,何况重写了has_object_permission()。大家检查施行诉求的顾客是不是留存Course对象的students波及。大家下一步就要利用IsEnrolled权限。

       如上 API 地址所示,大家能够透过List 本身的 GUID 或然 Title 来获取List,或然List的项集合的多寡。当需求向列表中插入新项时,大家要求利用列表项集合API,使用 POST 方法插入数据。而供给改革列表中某生龙活虎项时,则须求运用钦赐列表项 API,使用 ME福睿斯GE 方法来更新数据。

10. 万一不接收cross-domain类库,在展开POST操作时,都要在headers中增添X-RequestDigest参数,私下认可赋值是$("#__REQUESTDIGEST").val();

连串化课程内容

咱俩须求系列化课程内容。Content模型富含叁个通用的外键允许大家去关联分裂的故事情节模型对象。不过,大家给上风流倜傥章中给持有的从头到尾的经过模型增多了三个公用的render()措施。大家得以使用这一个方法去提供渲染过的剧情给我们的API。

编辑courses应用的api/serializers.py文本同临时候加多以下代码:

from ..models import Content

class ItemRelatedField(serializers.RelatedField):
    def to_representation(self, value):
        return value.render()

class ContentSerializer(serializers.ModelSerializer):
    item = ItemRelatedField(read_only=True)
    class Meta:
        model = Content
        fields = ('order', 'item')

在以上代码中,大家透过子类化REST Framework提供的RealtedField系列化器字段定义了一个定制字段并且重写了to_representation()方法。我们给Content模型定义了ContentSerializer类别化器何况选择定制字段给item转移外键。

我们必要二个代替类别化器给Module模型来含有它的内容,以至贰个扩张的Course连串化器。编辑api/serializers.py文件同不平时间增添以下代码:

   class ModuleWithContentsSerializer(serializers.ModelSerializer):
       contents = ContentSerializer(many=True)
       class Meta:
           model = Module
           fields = ('order', 'title', 'description', 'contents')

   class CourseWithContentsSerializer(serializers.ModelSerializer):
       modules = ModuleWithContentsSerializer(many=True)
       class Meta:
           model = Course
           fields = ('id', 'subject', 'title', 'slug',
                     'overview', 'created', 'owner', 'modules')           

让我们创设二个视图来模拟retrieve()操作的表现只是包涵课程内容。编辑api/views.py文件增添以下方法给CourseViewSet类:

   from .permissions import IsEnrolled
   from .serializers import CourseWithContentsSerializer

   class CourseViewSet(viewsets.ReadOnlyModelViewSet):
       # ...
       @detail_route(methods=['get'],
                     serializer_class=CourseWithContentsSerializer,
                     authentication_classes=[BasicAuthentication],
                     permission_classes=[IsAuthenticated,
                                         IsEnrolled])
       def contents(self, request, *args, **kwargs):
           return self.retrieve(request, *args, **kwargs)

上述的方法解释如下:

  • 大家运用detail_route装饰器去钦定这么些操作是在几个单独的指标上开展施行。
  • 小编们内定只有GET方法允许访谈这么些操作。
  • 大家应用新的CourseWithContentsSerializer类别化器类来含有渲染过的课程内容。
  • 大家使用IsAuthenticated和我们的定制IsEnrolled权力。只要产生了那点,大家得以确定保障独有在这里个科目中申请的客户技术访谈那么些课程的剧情。
  • 咱俩选拔存在的retrieve()操作去重回课程指标。

在您的浏览器中张开 。借使您选取科学的证件访问那么些视图,你拜会到那几个课程的每二个模块都包罗给渲染过的课程内容的HTML,如下所示:

   {
   "order": 0,
   "title": "Installing Django",
   "description": "",
   "contents": [
        {
        "order": 0,
        "item": "<p>Take a look at the following video for installing Django:</p>n"
        }, 
        {
        "order": 1,
        "item": "n<iframe width="480" height="360" src="http://www.youtube.com/embed/bgV39DlmZ2U?wmode=opaque" frameborder="0" allowfullscreen></iframe>nn"
        } 
    ]
    }   

您曾经营造了八个粗略的API允许其他服务器来程序化的会见课程应用。REST Framework还同意你通过ModelViewSet视图设置去管理创造以致编辑目的。大家已经覆盖了Django Rest Framework的严重性部分,可是你能够找到该框架愈来愈多的特色,通过翻看它的文书档案,地址在 。

       而关乎到数量修改时,我们需求把措施类型,如 POST,MELANDGE 等作为X-HTTP_Method 键的值增多到央求标头中。而且须求将诉求窗体摘要值作为 X-RequestDigest 的值传递步入。该值的获得格局是:向 http://网站URL/_api/contextinfo
出殡全体空正文的 POST 要求,并在 contextinfo 终结点再次来到的 XML 中提取 d:FormDigestValue 节点的值。还应该有正是标头中的 IF-MATCH 键的值,须要赋值为列表或列表项的 etag 值。借使赋值为 “*”,则不会思忖并发难点。

11. 过滤操作须求选用$filter,例如,只须要Title字段以“B”开始的数额:$filter=startswith(Title, 'B');只须求Title字段满含“B”的多寡:$filter=substringof('B',Title);

总结

在这里章中,你成立了二个RESTful API给其余的服务器去与您的web应用交互作用。

四个非凡的章节第十八章,Going Live须求在线下载:https://www. packtpub.com/sites/default/files/downloads/Django_By_Example_ GoingLive.pdf 。第十八章将会教你什么样采纳uWSGI甚至NGINX去构建二个分娩碰到。你还将学习到什么去导入二个定制中间件以至开创定制管理命令。

您早已达到那本书的末尾。恭喜你!你曾经学习到了经过Django构建一个打响的web应用所需的本领。那本书指引你通过任何的本领与Django集结去开垦了多少个现实生活能用到的品种。现在你曾经准备好去创设你自个儿的Django项目了,无论是三个简便的样板依旧贰个二个强硬的wen应用。

祝你下一回Django的孤注一掷好运!

       此外关于数据操作是亟需 POST 的源委:

图片 7

翻译总计

得了撒花!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

二零一四年1月7日起来翻译第意气风发章到前不久前年二月12日终究全书翻译实现!

对自家来说实乃一回非凡大胆的品味,但到头来百折不挠下去了!!!!!!!!

要相信本身做的到!

请允许本人多打多少个感叹号发表本身的心气!

感谢全体支持和慰勉的人!

精校职业也正值不断的进展中,请大家原谅一以前的渣翻!

事实上还应该有多数浩大想说的话,然则不了演说怎样好!就那样呢!

       更新时,必得富含 __metadata:type 和急需更新的字段。别的无需修改的字段能够不参与。删除时,U福睿斯L指向该条记录就可以。加多时,U奇骏L指向记录集结,POST内容应包含__metadata:type 和急需插入的必填字段

  1. REST API - GET

           $.ajax({

                  url: "https://XXX.sharepoint.com/_api/web/lists/GetByTitle('XXX')/items",
                  type: "GET",
                  headers: {"Accept": "application/json;odata=verbose"},
                  success: function(data){
                      if(data.d.results){
                          var $selectObj = $("<select id='deptSelect'></select>");
                          $.each(data.d.results, function(index, item){
                              $selectObj.append($("<option></option>").attr("value", item.ID + item.Title).text(item.Title));
                          });
                          $("#getDiv").append($selectObj);
                          $("#getDiv").append("<br/>"+JSON.stringify(data.d.results));
                      }
                  },
                  error: function(xhr){
                      alert(xhr.status+': '+xhr.statusText);
                  }
              });
    

      (2卡塔 尔(阿拉伯语:قطر‎对文本和文书夹的操作

瞩目:由于劳动器端分页的范围,私下认可景况下,每回只好获取100条数据,但足以使用$top参数来内定贰回要拿到多少条数据,但最大不能够当先5000;还足以利用__next来获得下后生可畏页的100条数据,请参见此处;

本文由88必发手机版发布于化工塑胶,转载请注明出处:商店应用中使用,第十二章

关键词:

上一篇:生活下去的勇气,深夜日记
下一篇:没有了