从Java执行shell CURL的正确方法是什么?
我通过以下代码执行curl:
// execute process
Process pr = null;
Runtime run = Runtime.getRuntime();
try {
pr = run.exec(cmdline.split(" "));
A ret = f.f(pr);
pr.waitFor();
return ret;
} catch (Exception ex) {
throw new RuntimeException("Executing " + cmdline, ex);
} finally {
try {
// close all those bloody streams
pr.getErrorStream().close();
pr.getInputStream().close();
pr.getOutputStream().close();
} catch (IOException ex) {
Log.get().exception(Log.Level.Error, "Closing stream: ", ex);
}
}
但是,当我将以下内容添加到exec字符串中时:
在将其传递给上面所示的方法之前,我正在构建卷曲字符串:
if (userAgent.contains(" ")) {
userAgent = " --user-agent '" + Exec.escapeShellString(userAgent) + "' ";
}
通过额外的单引号,我得到:
113.30.31.137 - - [03/Feb/2012:05:26:39 +0000] "GET / HTTP/1.1" 200 6781 "-" "'Mozilla/5.0(iPad;U;CPUOS3_2_1)'"
如果没有单引号,我会得到:
107.21.172.36 - - [03/Feb/2012:05:33:38 +0000] "GET / HTTP/1.1" 200 6781 "-" "'Mozilla/5.0(iPad;U;CPUOS3_2_1)"
有一个领先的单一报价,但不是一个最终报价。我认为不应该有单一的引用。。无论如何,java和curl之间有一种魔力
我想做的就是传递这样一个字符串: Opera/9.25(Windows NT 6.0;U;en)
期待着:
107.21.172.36 - - [03/Feb/2012:05:33:38 +0000] "GET / HTTP/1.1" 200 6781 "-" "Opera/9.25 (Windows NT 6.0; U; en)"
编辑:
我之所以使用curl,是因为curl似乎是在200.301或302之外的任何响应上检索内容的唯一选项
# 1 楼答案
您可以使用apache的HttpClient发送所需的所有头文件:
这只是一个小例子
# 2 楼答案
我不知道你为什么要尝试使用java中的curl,而你有一个名为Apache httpcleint的库来处理java中的这些事情
看看这个example
或者,您也可以使用java的内置URLConnection或HttpURLConnection类来实现这些目的
如果您有PHP背景,并且坚持使用cURL,请尝试libcurl Java bindings