为什么我在终端和 Java 中使用 运行 curl 命令时得到不同的结果?

Why am I obtaining different results when running curl command from Terminal and in Java?

我在 Java 或其衍生物中学到了很多对 运行 curl 的建议。例如, using curl command in Java

此外,我已经弄清楚如何 fetch the metadata of a given resource using DOI。从这条指令中,我对 运行 使用 Java 中的一小段来处理结果的 curl 命令非常感兴趣。

举个例子吧。 URL 是 http://dx.doi.org/10.1016/j.immuni.2015.09.001.

运行 来自终端的 curl 命令

curl -LH "Accept: application/x-bibtex" http://dx.doi.org/10.1016/j.immuni.2015.09.001

输出看起来像

@article{Biswas_2015,
    doi = {10.1016/j.immuni.2015.09.001},
    url = {https://doi.org/10.1016%2Fj.immuni.2015.09.001},
    year = 2015,
    month = {sep},
    publisher = {Elsevier {BV}},
    volume = {43},
    number = {3},
    pages = {435--449},
    author = {Subhra~K. Biswas},
    title = {Metabolic Reprogramming of Immune Cells in Cancer Progression},
    journal = {Immunity}

运行 这个 curl 命令在 Groovy

回收本站分享的一些代码,我写了如下过程。

Map result = [:]
String command = "curl -LH 'Accept: application/x-bibtex' http://dx.doi.org/10.1016/j.immuni.2015.09.001"
Process process = Runtime.getRuntime().exec(command)
InputStream stream = process.getInputStream()
result.put("data", stream.text)
process.destroy()

我得到的是 HTML 中的整个页面,而不是我期望的 BibTeX 格式的表格。

问题是:我做错了什么?你们中有人遇到过这个问题吗?

使用 exec 不是 shell - 你不能也不必为 a shell,那是不存在的。更多 exec(String) 默认使用 一个字符串分词器(基本上在空格处分割)来制作它 对于任何稍微高级的用例特别无用。

你最好总是使用接受的版本 命令的字符串数组 (+ args).

你在哪里有效调用看起来像这样(注意, 命令在空格处被分割——所以我使用 \' 来制作我的 shell 忽略那个):

# curl -LH \'Accept: application/x-bibtex\' http://dx.doi.org/10.1016/j.immuni.2015.09.001
curl: (6) Could not resolve host: application
... HTML ...

使用 groovy 的最短路径如下所示(注意 exec 也 有一个用于传递字符串数组的版本):

groovy:000> ["curl", "-LH", "Accept: application/x-bibtex", "http://dx.doi.org/10.1016/j.immuni.2015.09.001"].execute().text
===> @article{Biswas_2015,
9doi = {10.1016/j.immuni.2015.09.001},
9url = {https://doi.org/10.1016%2Fj.immuni.2015.09.001},
9year = 2015,
9month = {sep},
9publisher = {Elsevier {BV}},
9volume = {43},
9number = {3},
9pages = {435--449},
9author = {Subhra~K. Biswas},
9title = {Metabolic Reprogramming of Immune Cells in Cancer Progression},
9journal = {Immunity}
}

如果您需要“shell-isms”,请改用["sh", "-c", command]