Klocwork server提供了基于 http 的数据访问接口 Web API。使用的方法也是相当的简单。
(1)认证的问题
Web API的访问需要对访问者进行用户身份认证,身份认证信息是存储在一个 ltoken 文件中的。此ltoken文件使用Klocwork提供的命令 kwauth 来生成,访问者从客户端访问时,会从指定位置读取 ltoken 文件中的用户名、密码、服务器URL的信息来进行认证。
ltoken文件位于:
Windows Vista and Windows 7:C:\Users\\.klocwork\ltoken
Windows XP:C:\Documents and Settings\\.klocwork\ltoken
Unix:~/.klocwork/ltoken
Mac:~/.klocwork/ltoken
如果在这些位置找不到 ltoken 文件,则访问时会提示无法访问。此时,需要在发起访问的客户端执行 kwauth 命令:
kwauth --url http://:
然后,按提示输入用户名、密码,即可在上述位置生成 ltoken 文件。
(2)如何使用
Web API 为类似 REST API 的访问接口,以 http 访问的方式来使用。可以使用各种编程语言,例如 Java, Python, Perl 等。
本文介绍 Python 方式(本例来自 Klocwork online document):
import urllib, urllib2, json, sys, os.path, getpass, time
def getToken(host, port, user) :
ltoken = os.path.normpath(os.path.expanduser("~/.klocwork/ltoken"))
ltokenFile = open(ltoken, 'r')
for r in ltokenFile :
rd = r.strip().split(';')
if rd[0] == host and rd[1] == str(port) and rd[2] == user :
ltokenFile.close()
return rd[3]
ltokenFile.close()
class Issue(object) :
def __init__(self, attrs) :
self.id = attrs["id"]
self.message = attrs["message"]
self.file = attrs["file"]
self.method = attrs["method"]
self.code = attrs["code"]
self.severity = attrs["severity"]
self.severityCode = attrs["severityCode"]
self.state = attrs["state"]
self.status = attrs["status"]
self.taxonomyName = attrs["taxonomyName"]
self.url = attrs["url"]
self.created=time.ctime(attrs["dateOriginated"]/1000)
def __str__(self) :
return "[%d] %s\n\t%s | %s\n\tCode %s | Severity: %s(%d) | State: %s | Status: %s | Taxonomy: %s | Created: %s\n\t%s" % (
self.id, self.message, self.file, self.method, self.code, self.severity, self.severityCode, self.state,
self.status, self.taxonomyName, self.created, self.url
)
def from_json(json_object) :
if 'id' in json_object :
return Issue(json_object)
return json_object
host = "localhost"
port = 8090
user = getpass.getuser()
project = "afd"
url = "http://%s:%d/review/api" % (host, port)
values = {"project": project, "user": user, "action": "search"}
loginToken = getToken(host, port, user)
if loginToken is not None :
values["ltoken"] = loginToken
values["query"] = "severity:1"
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
for record in response :
print json.loads(record, object_hook=from_json)
领取专属 10元无门槛券
私享最新 技术干货