4
curl -k -XPOST 'https://localhost:9200/myweb/myrep/**input_string**/_update'  -d '{"doc":{"status":"Disconnected"}}'

Invoke above for a list of input_string from a XML file

Option 1: Write a bash script to accomplish above and then call this script from Java code

Option 2: RunTime.exec() to call curl command in a for loop like this : curl command in java

Is there any other better way?

This will be one of the important steps in my overall Java program which is doing various other things. That's the reason I am looking for ways to integrate this well with Java code rather than providing an option to run above as separate CLI script.

Community
  • 1
  • 1
Rockoder
  • 746
  • 2
  • 11
  • 22
  • 1
    Better way is to not use `curl` at all. Java is well capable of doing anything that curl can. Try URLConnection for instance https://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html – 11thdimension Dec 31 '15 at 18:25
  • I use REST a lot via Java. This is a mechanism given to me by some other developer and is an internal URL. How would you invoke above via a FF add-on poster or Chrome add on to test it. How would we pass -d '{"doc":{"status":"Disconnected"}}' via Java. I have used REST wherein I would post XML in the body but have never used JSON like this via Java in REST calls. – Rockoder Dec 31 '15 at 18:31
  • There are half dozen or more excellent Java libraries all capable of doing HTTP calls (there's no such thing as REST calls). Whichever developer gave you this should be fired and you should deny ever knowing them. – Abhijit Sarkar Dec 13 '16 at 03:56

1 Answers1

5

Here's implementation of POST and GET via HTTPURLConnection.

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class PostGET {
    public static void main(String[] args) throws UnsupportedEncodingException {
        Map<String, String> headerMap = new HashMap<String, String>();
        String bodyStr = "{\"doc\":{\"status\":\"Disconnected\"}}";
        InputStream body = new ByteArrayInputStream(bodyStr.getBytes("UTF-8"));

        System.out.println("Sending POST");
        post("http://127.0.0.1:3000", headerMap, body);

        System.out.println("");

        System.out.println("Sending GET");
        get("http://127.0.0.1:3000?test=hello", headerMap);
    }

    public static void post(String targetUrl, Map<String, String> headerMap,
            InputStream body) {
        HttpURLConnection http = null;
        try {
            http = (HttpURLConnection) new URL(targetUrl).openConnection();
            http.setRequestMethod("POST");
            http.setDoOutput(true);
            for (Map.Entry<String, String> header : headerMap.entrySet()) {
                http.setRequestProperty(header.getKey(), header.getValue());
            }

            OutputStream out = http.getOutputStream();
            out.write(readInput(body));
            out.close();

            InputStream in = http.getInputStream();
            String response = new String(readInput(in), "UTF-8");

            System.out.println("Response code: " + http.getResponseCode());
            System.out.println("Response headers : " + http.getHeaderFields());
            System.out.println("response from server: " + response);


        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void get(String targetUrl, Map<String, String> headerMap) {
        HttpURLConnection http = null;
        try {
            http = (HttpURLConnection) new URL(targetUrl).openConnection();
            http.setRequestMethod("GET");

            for (Map.Entry<String, String> header : headerMap.entrySet()) {
                http.setRequestProperty(header.getKey(), header.getValue());
            }

            InputStream in = http.getInputStream();
            String response = new String(readInput(in), "UTF-8");

            System.out.println("Response code: " + http.getResponseCode());
            System.out.println("Response headers : " + http.getHeaderFields());
            System.out.println("response from server: " + response);


        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static byte[] readInput(InputStream in) {
        ByteArrayOutputStream bais = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int readLen = -1;
        try {
            while ((readLen = in.read(buffer)) != -1) {
                bais.write(buffer, 0, readLen);
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return bais.toByteArray();
    }
}

Below is a Nodejs Server to test this with

http = require('http');
server = http.createServer( function(req, res) {
    if (req.method == 'POST') {
        console.log("POST");
        var body = '';
        req.on('data', function (data) {
            body += data;
            console.log("Partial body: " + body);
        });
        req.on('end', function () {
            console.log("Body: " + body);
        });
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.end('post received');
    } else if(req.method === 'GET') {
        console.log("GET");
        var params = req.url.split('?');
        params = params.length > 1 ?  params[1] : "";
        console.log('params : ' + params);

        var html = '<html><body><h1>' + params+ '</h1></body>';
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.end(html);
    }

});

port = 3000;
host = '127.0.0.1';
server.listen(port, host);
console.log('Listening at http://' + host + ':' + port);

Java Client Output

Sending POST
Response code: 200
Response headers : {Transfer-Encoding=[chunked], null=[HTTP/1.1 200 OK], Connection=[keep-alive], Date=[Thu, 31 Dec 2015 19:40:05 GMT], Content-Type=[text/html]}
response from server: post received

Sending GET
Response code: 200
Response headers : {Transfer-Encoding=[chunked], null=[HTTP/1.1 200 OK], Connection=[keep-alive], Date=[Thu, 31 Dec 2015 19:40:05 GMT], Content-Type=[text/html]}
response from server: <html><body><h1>test=hello</h1></body>

Node Server Output

Listening at http://127.0.0.1:3000
POST
Partial body: {"doc":{"status":"Disconnected"}}
Body: {"doc":{"status":"Disconnected"}}
GET
params : test=hello
11thdimension
  • 10,333
  • 4
  • 33
  • 71