Исполняя CURL из Java - как правильно? - PullRequest
1 голос
/ 03 февраля 2012

Я выполняю 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; ru)

и ожидайте этого:

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)"

Edit:

Причина, по которой я использую curl, заключается в том, что curl кажется единственной опцией, которая извлекает содержимое любого ответа, кроме 200.301 или 302.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Я не знаю, почему вы пытаетесь использовать curl из java, когда у вас есть библиотека под названием Apache httpcleint для обработки этих вещей в java.

Посмотрите на это пример .

В качестве альтернативы вы также можете использовать для этих целей встроенный класс URLConnection или HttpURLConnection .

Если вы изPHP фон и если вы настаиваете на использовании cURL, попробуйте libcurl Java bindings .

1 голос
/ 03 февраля 2012

Вы можете использовать HttpClient из apache для отправки всех необходимых заголовков:

 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.HttpException;
 import org.apache.commons.httpclient.methods.GetMethod; 



 public static void main(String[] args) throws HttpException, IOException { 

     HttpClient httpClient = new HttpClient();
     GetMethod getMethod = new GetMethod("http://cetatenie.just.ro/Home/ORDINEANC.aspx");
     getMethod.addRequestHeader("Host", "cetatenie.just.ro");
     getMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");

     httpClient.executeMethod(getMethod);
     String response = getMethod.getResponseBodyAsString(); 
   }
}

Это только один небольшой пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...