我将Django Rest框架与AcceptHeaderVersioning结合使用,如下所述:
{{3}}
如果未指定任何版本,但指定了正确的版本,我想测试API是否返回默认版本。但是,似乎不可能将version参数传递给测试。这是一个示例:
def testCheckVersion(self):
versions = [u'v0.1', u'v0.2']
self.key = APIKey(name='Example Key')
self.key.save()
for version in versions:
response = self.client.get('/api/data/',
VERSION="{0}".format(version),
**{'Api-Key': self.key.key})
self.assertEqual(response.status_code, 200)
content = json.loads(response.content)
self.assertEqual(content['api_version'], version)
这总是提供默认的api版本(在这种情况下为v0.2)。我尝试了各种方法来重新制作response =
行,但是没有运气。可以通过改用QueryParameterVersioning来解决此问题,但我宁愿不这样做,因此,如果您有任何建议,请告诉我。
答案 0 :(得分:0)
https://www.django-rest-framework.org/api-guide/versioning/#acceptheaderversioning
文档说,您需要使用其示例在Accept
标头中包括该版本:
这是一个使用accept标头版本控制样式的HTTP请求示例。
GET /bookings/ HTTP/1.1
Host: example.com
Accept: application/json; version=1.0
在上面的示例请求中,request.version属性将返回字符串'1.0'。
根据Django文档https://docs.djangoproject.com/en/1.11/ref/request-response/#django.http.HttpRequest.META,您在self.client.get()
调用中还没有正确设置标题:
除上面给出的CONTENT_LENGTH和CONTENT_TYPE外,通过将所有字符都转换为大写字母,用下划线替换所有连字符,并在名称中添加HTTP_前缀,将请求中的所有HTTP标头都转换为META键。因此,例如,一个名为X-Bender的标头将被映射到META键HTTP_X_BENDER。
您得到的测试应该看起来像这样:
def testCheckVersion(self):
versions = [u'v0.1', u'v0.2']
self.key = APIKey(name='Example Key')
self.key.save()
for version in versions:
### This call has changed
response = self.client.get(
'/api/data/',
HTTP_ACCEPT=f"application/json; version={version}"
)
self.assertEqual(response.status_code, 200)
content = json.loads(response.content)
self.assertEqual(content['api_version'], version)