How to call REST from jenkins workflow

前端 未结 5 1926
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-24 06:23

I wonder how to call REST API from a (groovy) Jenkins workflow script. I can execute \"sh \'curl -X POST ...\'\" - it works, but building the request as a curl command is cu

相关标签:
5条回答
  • 2020-12-24 06:55

    Native Groovy Code without importing any packages:

    // GET
    def get = new URL("https://httpbin.org/get").openConnection();
    def getRC = get.getResponseCode();
    println(getRC);
    if(getRC.equals(200)) {
        println(get.getInputStream().getText());
    }
    
    
    // POST
    def post = new URL("https://httpbin.org/post").openConnection();
    def message = '{"message":"this is a message"}'
    post.setRequestMethod("POST")
    post.setDoOutput(true)
    post.setRequestProperty("Content-Type", "application/json")
    post.getOutputStream().write(message.getBytes("UTF-8"));
    def postRC = post.getResponseCode();
    println(postRC);
    if(postRC.equals(200)) {
        println(post.getInputStream().getText());
    }
    
    0 讨论(0)
  • 2020-12-24 06:56

    I had trouble installing the HTTPBuilder library, so I ended up using the more basic URL class to create an HttpUrlConnection.

    HttpResponse doGetHttpRequest(String requestUrl){    
        URL url = new URL(requestUrl);    
        HttpURLConnection connection = url.openConnection();    
    
        connection.setRequestMethod("GET");    
    
        //get the request    
        connection.connect();    
    
        //parse the response    
        HttpResponse resp = new HttpResponse(connection);    
    
        if(resp.isFailure()){    
            error("\nGET from URL: $requestUrl\n  HTTP Status: $resp.statusCode\n  Message: $resp.message\n  Response Body: $resp.body");    
        }    
    
        this.printDebug("Request (GET):\n  URL: $requestUrl");    
        this.printDebug("Response:\n  HTTP Status: $resp.statusCode\n  Message: $resp.message\n  Response Body: $resp.body");    
    
        return resp;    
    }  
    
    /**    
     * Posts the json content to the given url and ensures a 200 or 201 status on the response.    
     * If a negative status is returned, an error will be raised and the pipeline will fail.    
     */    
    HttpResponse doPostHttpRequestWithJson(String json, String requestUrl){    
        return doHttpRequestWithJson(json, requestUrl, "POST");    
    }    
    
    /**    
     * Posts the json content to the given url and ensures a 200 or 201 status on the response.    
     * If a negative status is returned, an error will be raised and the pipeline will fail.    
     */    
    HttpResponse doPutHttpRequestWithJson(String json, String requestUrl){    
        return doHttpRequestWithJson(json, requestUrl, "PUT");    
    }
    
    /**    
     * Post/Put the json content to the given url and ensures a 200 or 201 status on the response.    
     * If a negative status is returned, an error will be raised and the pipeline will fail.    
     * verb - PUT or POST    
     */    
    HttpResponse doHttpRequestWithJson(String json, String requestUrl, String verb){    
        URL url = new URL(requestUrl);    
        HttpURLConnection connection = url.openConnection();    
    
        connection.setRequestMethod(verb);    
        connection.setRequestProperty("Content-Type", "application/json");    
        connection.doOutput = true;    
    
        //write the payload to the body of the request    
        def writer = new OutputStreamWriter(connection.outputStream);    
        writer.write(json);    
        writer.flush();    
        writer.close();    
    
        //post the request    
        connection.connect();    
    
        //parse the response    
        HttpResponse resp = new HttpResponse(connection);    
    
        if(resp.isFailure()){    
            error("\n$verb to URL: $requestUrl\n    JSON: $json\n    HTTP Status: $resp.statusCode\n    Message: $resp.message\n    Response Body: $resp.body");    
        }    
    
        this.printDebug("Request ($verb):\n  URL: $requestUrl\n  JSON: $json");    
        this.printDebug("Response:\n  HTTP Status: $resp.statusCode\n  Message: $resp.message\n  Response Body: $resp.body");    
    
        return resp;    
    }  
    
    class HttpResponse {    
    
        String body;    
        String message;    
        Integer statusCode;    
        boolean failure = false;    
    
        public HttpResponse(HttpURLConnection connection){    
            this.statusCode = connection.responseCode;    
            this.message = connection.responseMessage;    
    
            if(statusCode == 200 || statusCode == 201){    
                this.body = connection.content.text;//this would fail the pipeline if there was a 400    
            }else{    
                this.failure = true;    
                this.body = connection.getErrorStream().text;    
            }    
    
            connection = null; //set connection to null for good measure, since we are done with it    
        }       
    }
    

    And then I can do a GET with something like: HttpResponse resp = doGetHttpRequest("http://some.url");

    And a PUT with JSON data using something like: HttpResponse resp = this.doPutHttpRequestWithJson("{\"propA\":\"foo\"}", "http://some.url");

    0 讨论(0)
  • 2020-12-24 06:58

    There is a built in step available that is using Jenkins HTTP Request Plugin to make http requests.

    Plugin: https://wiki.jenkins-ci.org/display/JENKINS/HTTP+Request+Plugin

    Step documentation: https://jenkins.io/doc/pipeline/steps/http_request/#httprequest-perform-an-http-request-and-return-a-response-object

    Example from the plugin github page:

    def response = httpRequest "http://httpbin.org/response-headers?param1=${param1}"
    println('Status: '+response.status)
    println('Response: '+response.content)
    
    0 讨论(0)
  • 2020-12-24 07:01

    Blocking the main thread on I/O calls is not a good idea.

    Delegating the I/O operation to a shell step is the recommended way currently.

    The other way, which requires development, is to add a new step. By the way, there is an initiative to add a common set of steps to be used securely inside the pipeline script, although a full REST client owes its own plugin.

    0 讨论(0)
  • 2020-12-24 07:05

    Have you tried Groovy's HTTPBuilder Class? For example:

    @Grapes(
        @Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1')
    )
    
    import groovyx.net.http.HTTPBuilder
    import static groovyx.net.http.ContentType.*
    import static groovyx.net.http.Method.*
    
    def http = new HTTPBuilder("http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo")
    
    http.request(POST, JSON ) { req ->
        body = []
        response.success = { resp, reader ->
            println "$resp.statusLine   Respond rec"
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题