文章目录
🎅1. REST API
官方文档手册,点击这里
如果已经有了搭建好的CVAT环境,那么可以访问http://XXX:8080/api/swagger/
其中有很多分类,主要包括以下类型:
auth - user authorization queries
comments - requests to post/delete comments to issues
issues - update, delete and view problem comments
jobs -requests to manage the job
lambda - requests to work with lambda function
projects - project management queries
restrictions - requests for restrictions
reviews -adding and removing the review of the job
server - server information requests
tasks - requests to manage tasks
users - user management queries
其中最值得关注的应该是:可以请求标注信息
的jobs
🎠2. 以job接口为例
👑2.1 自带示例
其实给了访问方法, 点击某行,比如下面的Method returns details of a job
然后可以看到对于jobs来说,最重要的一个属性就是id,
输入一个你项目中存在的job的id序号,比如job #6
,点击try it out
,然后界面就会变成如下样子,之前try it out
的地方变成cancel
,同时多出来一个Execute
和Clear
按键。
点击Execute
,可以看到下面的response
🎀2.2 project,task以及job的id
其实CVAT有好几种组织形式,分别是Projects,每个Projects可以包含多个tasks,每个task包含多个job,但是直接在task界面看到的#15
这些数字序号其实是job的id。
project和task在有些界面也是可以看到它们的id的,例如:
Project # 2
Task #13
😀3. 代码
🍙3.1 授权
一开始没有考虑到授权/密码等问题,直接:
import requests
import json
job_id = 6
request_url = "http://data.a-stack.com:8080/api/v1/jobs/"+str(job_id)
response=requests.get(request_url)
if response.status_code==200:
print(json.loads(response))
else:
print(response)
返回<Response [401]>
未授权。
直接去看文档,这里,没有看到和请求授权相关的内容,
- 查询看到一个swagger,了解了一下,参考:OpenAPI规范3-Swagger2
- 另外,还有关于OpenAPI的说明,参考:OpenAPI 规范摘要
🍱3.2 token问题
💘3.2.1 auth接口
请教了同事之后,知道需要先去auth
接口,输入用户名密码等得到token,这里还看到一个X-CSRFToken
的东西,需要加在headers中,但是这个每发送一次请求就会更新。
搜索之后,发现网上对这个东西也有一些说法,主要是django这个框架会有一个csrf机制,
根据:django设置csrf_token
关于csrf_token
csrf:跨站请求伪造,防止其他人改造,盗取信息,反正就是一种网站的防护措施
服务器端:设置随机的csrf_token,get请求的时候就该设置好
客户端:携带上相应的csrf_token,post请求的时候携带上
另外,搜索过程发现有人可以在网页上找到这个csrf-token,随即刷新页面,查看页面html代码
确实页面中有一个元素含有这个csrf-token,搞一下填进去就好了。但是加进去还是错,尝试把请求的链接直接输入网页:
就看到了这样的测试界面
所以其实是被给的提示中的curl
命令误导了:
API说明中说的很简单,不需要header(也就不需要去网页里扣那个csrftoken了),只需要这几个data即可。最终代码如下:
def get_token(UserName, Email, PassWord):
request_url = "XXXX/api/v1/auth/login"
params = {"username": UserName, "email": Email, "password": PassWord}
response = requests.post(request_url, data=params)
if response.status_code == 200:
print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
dictRS = dict(response.json())
return dictRS
else:
print(response)
🐬3.2.2 job接口
同理,在使用那个测试页面查看过到底需要哪些字段后,可以去看看job接口的情况,确定到底该以什么样的形式发送请求。
可以看到,对于job这个接口来说,其实还有几个选项,不管那么多,测试最简单的。
auth接口可以得到key/token,原话是:
- Check the credentials and return the REST Token if the credentials are valid and authenticated.
检查凭据,如果凭据有效且经过身份验证,则返回REST令牌。- Calls Django Auth login method to register User ID in Django session framework
调用Django Auth login方法在Django session框架中注册用户ID- Accept the following POST parameters: username, password Return the REST Framework Token Object’s key.
使用POST参数,用户名,密码,返回REST框架令牌对象的密钥
所以这里得到的密钥,是要作为后面API访问时登录的依据。
由于之前没有研究过restAPI,所以搜索的时候搜了很多无效解决方案,最后还是直接看django-rest-framework官方文档,找到了我关心的东西。
简单来说,就是要在新的请求中,把这个Authorization
授权信息放到header中,同时获取到的key和token这个词语之间要有个空格,最后的代码类似:
def get_result(token):
request_url = "XXXX/api/v1/jobs/6"
print(request_url)
headers = {"Authorization": "Token " + token}
# 头部信息中有一个授权字段,其值是Token+空格+auth接口返回的key作为token
response = requests.get(request_url, headers=headers)
if response.status_code == 200:
print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
else:
print(response)
然后就可以获取和测试界面一样的数据了,OK!!!!!!!!
💎3.2.3 其他接口
有了job接口解决掉授权的问题之后,其他都是一样的,比如要获取project的介绍信息,整体代码如下:
import requests
import json
def get_token(username, email, password):
"""
授权获取token
"""
request_url = "XXX/api/v1/auth/login"
params = {"username": username, "email": email, "password": password}
response = requests.post(request_url, data=params)
if response.status_code == 200:
print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
dictRS = dict(response.json())
return dictRS
else:
print(response)
def get_result(token):
request_url = "XXX/api/v1/projects"
print(request_url)
# 将获取的token放入header中作为授权
headers = {"Authorization": "Token " + token}
response = requests.get(request_url, headers=headers)
if response.status_code == 200:
print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
else:
print(response)
username = "XXX"
email = "XX@XX.com"
password = "XXX"
rs = get_token(username, email, password)
key = rs["key"]
get_result(key)
然后就可以得到想要的projects信息了