简体   繁体   English

从Java调用curl命令

[英]Invoking curl commands from Java

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 从上面调用XML文件中的input_string列表

Option 1: Write a bash script to accomplish above and then call this script from Java code 选项1:编写一个bash脚本来完成上述操作,然后从Java代码中调用此脚本

Option 2: RunTime.exec() to call curl command in a for loop like this : curl command in java 选项2:RunTime.exec()在for循环中调用curl命令,如下所示: java中的curl命令

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. 这将是我整个Java程序中执行各种其他操作的重要步骤之一。 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. 这就是为什么我正在寻找将这种方法与Java代码集成在一起的方法,而不是提供一个选项来在上面作为单独的CLI脚本运行。

Here's implementation of POST and GET via HTTPURLConnection. 这是通过HTTPURLConnection实现POST和GET。

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 下面是一个Nodejs服务器来测试它

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 Java客户端输出

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM