使用Jenkins公开带有JSON内容的HTTP API必威国际有限公司

本页解释了如何在Jenkins插件中通过HTTP API公开Json对象,使用必威国际有限公司得到而且帖子动词。本页还展示了如何使用JenkinsRules来测试它必威国际有限公司必威国际有限公司jenkins-test-harness

先决条件:POJO(普通老式Java对象)

该对象表示在HTTP服务器(Jenkins)和客户机(例如curl)之间交换的结构化数据。必威国际有限公司我们使用一个非常简单的java对象作为示例,但在生产代码中,您将有更复杂的对象来操作。

注意,如果使用Stapler (JSONObject)编组和解组JSON,则需要一个空构造函数。

公共静态MyJsonObject私人字符串消息;// JSON解析所需的空构造函数。公共MyJsonObject () {}公共MyJsonObject (字符串消息){.message =消息;}公共无效setMessage (字符串消息){.message =消息;}公共字符串getMessage () {返回消息;}}

与Jenkins处理GET必威国际有限公司

本部分将展示如何公开返回结构化JSON响应的HTTP GET。

/ * * / (1)进口hudson.model.RootAction进口net.sf.json.JSONObject进口org.junit.Rule进口org.junit.Test进口org.kohsuke.stapler.HttpResponse进口org.kohsuke.stapler.QueryParameter进口org.kohsuke.stapler.WebMethod进口org.kohsuke.stapler.json.JsonBody进口org.kohsuke.stapler.json.JsonHttpResponse进口org.kohsuke.stapler.verb.GET进口org.kohsuke.stapler.verb.POST@Extension/ * * / (2)公共静态JsonAPI实现了RootAction/ * (3) * /@CheckForNull@Override公共字符串getIconFileName () {返回/ * (4) * /@CheckForNull@Override公共字符串getDisplayName () {返回/ * * / (5)@Override公共字符串getUrlName () {返回custom-api/ * * / (6)@ get@WebMethod(name =get-example/ * * / (7)公共/ * (8) * /JsonHttpResponse getExample() {JSONObject响应= JSONObject. fromobject (MyJsonObject (我是詹金斯必威国际有限公司));返回JsonHttpResponse(反应,200);/ * * / (9)@ get@WebMethod(name =get-example-param公共JsonHttpResponse getWithParameters (@QueryParameter(需要=真正的字符串paramValue/ * * / (9)) {assertNotNull (paramValue);MyJsonObject MyJsonObject =MyJsonObject (我是詹金斯必威国际有限公司+ paramValue);JSONObject响应= JSONObject. fromobject (myJsonObject);返回JsonHttpResponse(反应,200);}@ get@WebMethod(name =get-error500公共JsonHttpResponse getError500 () {* / / * (10)MyJsonObject MyJsonObject =MyJsonObject (误差是500);JSONObject jsonResponse = JSONObject. fromobject (myJsonObject);JsonHttpResponse error500 =JsonHttpResponse (jsonResponse500);error500;}}
  1. 要使用的导入的非详尽列表。

  2. 一定是一个扩展被Jenkins发现作为一个服务。必威国际有限公司

  3. 这个类是RootAction的扩展。它是一种公开HTTP路径的方法,通常用于公开Web UI,但它也可以在不呈现HTML的情况下使用。

  4. 因为没有HTML/Jelly渲染,所以不需要图标。

  5. 因为没有HTML/Jelly呈现,所以不需要显示名称。

  6. getUrlName ()是JSON API的根。类中的每个WebMethod都以this作为前缀。

  7. @ get表示期望的HTTP方法,和@WebMethod表示它正在接受HTTP请求。默认情况下,使用WebMethod的JAVA名称,但可以通过using指定不同的名称name =

  8. JsonHttpResponse的子类HttpResponse指示响应内容将是JSON

  9. 可以在响应中设置HTTP状态。

  10. 该方法get-error500添加到示例中,以演示如何将错误响应设置为JSON。

测试与旋度

一个运行mvn现病史:在插件中应该足以在本地运行它。假设詹金斯在必威国际有限公司http://localhost:8080/必威国际有限公司jenkins/,此时你应该有:

curl -XGET \ -w "\n STATUS:%{http_code}" \ http://localhost:8080/必威国际有限公司jenkins/custom-api/get-example-param?paramValue=hello {"message":"I am Jenkins hello"} STATUS:200

使用JenkinsRule进行测试的示例必威国际有限公司

公共JsonAPITest@Rule公共必威国际有限公司JenkinsRule j =必威国际有限公司JenkinsRule ();私人静态字符串GET_API_URL =custom-api / get-example-param吗?paramValue =你好@Test公共无效testGetJSON ()抛出异常{J必威国际有限公司enkinsRule。WebClient = j.createWebClient();//测试一个简单的GET,它应该回答200 OK和一个JSON必威国际有限公司JenkinsRule。响应= webClient.getJSON(GET_API_URL);assertTrue (response.getContentAsString () .contains (我是Jen必威国际有限公司kinsRule你好));assertequal (response.getStatusCode (),200);}@Test公共无效testAdvancedGetJSON ()抛出异常//给定Jenkin必威国际有限公司s设置,用户为adminMockAuthorizationStrategy auth =MockAuthorizationStrategy () .grant必威国际有限公司 (Jenkins.ADMINISTER) .everywhere (), (管理);j.必威国际有限公司jenkins.setSecurityRealm (j.createDummySecurityRealm ());j.必威国际有限公司jenkins.setAuthorizationStrategy(身份验证);//我们需要设置WebClient,我们使用它来调用HTTP API必威国际有限公司JenkinsRule。WebClient = j.createWebClient();//默认情况下,如果状态码不是ok, WebClient抛出异常//因为我们想要断言错误状态代码,我们需要设置为false。webClient.setThrowExceptionOnFailingStatusCode ();// -禁止未经认证的简单调用响应= webClient.getJSON (GET_API_URL);assertequal (response.getStatusCode (),403);// -相同的调用,但使用withBasicApiToken()进行认证应该没问题响应= webClient.withBasicApiToken (管理) .getJSON (GET_API_URL);assertequal (response.getStatusCode (),200);}

处理与Jenkins的POST必威国际有限公司

本节将展示如何公开接受结构化JSON对象作为输入的HTTP端点,并使用JSON结构化对象进行响应。对于本例,使用相同的Object作为输入和输出,但也可以为响应使用不同的JSON结构。

从课堂开始JsonAPI为GET示例提供,添加:

@POST@WebMethod(name =创建公共JsonHttpResponse创建(@JsonBodyMyJsonObject身体){//执行创建所需的任何逻辑//在示例中,我们将从请求中解析出的消息大写。JSONObject响应=JSONObject ();response.put (消息body.message.toUpperCase ());返回JsonHttpResponse(反应,200);}

测试与旋度

一个运行mvn现病史:在插件中应该足以在本地运行它。假设詹金斯在必威国际有限公司http://localhost:8080/必威国际有限公司jenkins/,此时你应该有:

写一个文件my.json包含JSON主体:

{"message":"要发送的好消息"}

如果你需要一个用户和一个令牌:

  • 进入Jenk必威国际有限公司ins UI

  • 以用户身份登录,例如'myuser'

  • 在右上角单击用户名

  • 继续配置(针对此用户)

  • 在“API令牌”部分创建一个新的令牌。

有关令牌的其他文档,请访问:

然后发送POST请求:

curl -XPOST \ -H "Content-Type: application/json" \——user myuser: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ http://loca必威国际有限公司lhost:40393/jenkins/testing-cli/create \——data "@/my。json" \ {"message":"要发送的漂亮消息"

使用JenkinsRule进行测试的示例必威国际有限公司

从课堂开始JsonAPITest对于GET示例,添加:

@Test公共无效testPostJSON ()抛出异常//给定Jenkin必威国际有限公司s设置,用户为adminMockAuthorizationStrategy auth =MockAuthorizationStrategy () .grant必威国际有限公司 (Jenkins.ADMINISTER) .everywhere (), (管理);j.必威国际有限公司jenkins.setSecurityRealm (j.createDummySecurityRealm ());j.必威国际有限公司jenkins.setAuthorizationStrategy(身份验证);//我们需要设置WebClient,我们使用它来调用HTTP API必威国际有限公司JenkinsRule。WebClient = j.createWebClient();//测试一个经过认证的POST,它应该回答200 OK并返回相同的jsonMyJsonObject objectToSend =MyJsonObject (必威国际有限公司詹金斯才是出路!);必威国际有限公司JenkinsRule。响应= webClient .withBasicApiToken(管理) .postJSON (testing-cli /创建JSONObject.fromObject (objectToSend));//因为API返回相同的对象,我们断言输入消息。assertTrue (response.getContentAsString () .contains (必威国际有限公司詹金斯才是出路!));assertequal (response.getStatusCode (),200);}

一些额外的信息

对于熟悉REST/JSON概念的人,您可能想要使用其他HTTP动词,它应该可以工作,但因为通常只在Jenkins中必威国际有限公司得到而且帖子本页只展示了这两个动词的例子。

您可能还想使用一些HTTP状态代码,遵循HTTP约定,如201对于已创建的,它也可以工作,上面的例子返回显式的200status来显示如何管理返回的HTTP状态。有些状态是由Jenkins Core管理的,可能会自动必威国际有限公司返回,比如403当请求中的用户不具有所需的权限或匿名时,或者404当没有找到HTTP API时。

如果你不熟悉Jenkins的建筑,你可以去看看必威国际有限公司Jenkins应用程序的高级视图必威国际有限公司而在体系结构

对于Jenkins的HTTP层的更高级阅读,它由必威国际有限公司订书机

参考文献

Baidu