Java HttpConnection отказался, но curl эквивалент работает - PullRequest
3 голосов
/ 07 августа 2009

Я схожу с ума по этому вопросу. Моя команда curl работает:

завиток http://testuser:testpwd@qabox3:8501/xmlcontroller

Но, когда я пробую то, что выглядит как эквивалентное http-соединение в Java, выдается «соединение отклонено». Что мне не хватает? Я попробовал дюжину вариантов, чтобы попытаться установить эту связь сегодня, и у меня нет идей.

        URL url = new URL( "http://qabox3:8051/xmlcontroller" );
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod( "GET" );
        String encoding = new sun.misc.BASE64Encoder().encode( "testuser:testpwd".getBytes() );
        conn.setRequestProperty("Authorization", "Basic " + encoding );
        InputStream content = conn.getInputStream();  // <--- fails here every time.
        BufferedReader in = new BufferedReader( new InputStreamReader( content ) );
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println( line );
        }

Более того, я могу использовать Java Runtime.exec () для выполнения команды curl, и это все еще работает ... так что я явно что-то не так делаю в компоненте HttpURLConnection.

Вот стек, который я вижу (теперь использующий HttpClient, но в основном тот же стек с библиотеками Java).

Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:520)
at java.net.Socket.connect(Socket.java:470)
at java.net.Socket.<init>(Socket.java:367)
at java.net.Socket.<init>(Socket.java:240)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:80)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:122)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at MyClass.sendRequest(iQ411RequestHandlerProxy.java:277)

Просто для удовольствия, вот подробный вывод. Ничего особенного в шапке ...

> GET /xmlcontroller HTTP/1.1
> Authorization: Basic cWFfc3VwZXI6cWFfc3VwZXI=
> User-Agent: curl/7.16.3 (i686-pc-cygwin) libcurl/7.16.3 OpenSSL/0.9.8k zlib/1.2.3 libssh2/0.15-CVS
> Host: qabox3:8501
> Accept: */*
>

Ответы [ 4 ]

11 голосов
/ 07 августа 2009

Кажется, вы используете два разных номера порта: 8501 и 8051? Может ли это быть проблемой или опечатка в вопросе?

завиток http://testuser:testpwd@qabox3:8501/xmlcontroller

URL url = новый URL ("http://qabox3:8051/xmlcontroller");

С уважением, Ian

0 голосов
/ 07 августа 2009

В вашем примере кода вы никогда не вызываете conn.connect () . Вызовы openConnection () создают объект URLConnection , но перед взаимодействием с соединением необходимо вызвать метод connect.

0 голосов
/ 07 августа 2009

Может ли это быть проблема с прокси HTTP? Может быть, curl использует ваш HTTP-прокси, а ваше Java-приложение пытается подключиться напрямую?

0 голосов
/ 07 августа 2009

Взгляните на HttpClient . Он поддерживает различные схемы аутентификации без необходимости вручную кодировать / указывать заголовки.

...