URLConnection FileNotFoundException dla niestandardowych źródeł portów HTTP

Próbowałem użyć Mrówki Apaczów.Get Zadanie uzyskanie listy WSDL wygenerowanej przez inny zespół w naszej firmie. Mają je hostowane na weblogic 9.serwer x na http://....com:7925/services/. jestem w stanie dostać się do strony przez przeglądarkę, ale zadanie get daje mi wyjątek FileNotFoundException podczas próby skopiowania strony do lokalnego pliku do analizy. Nadal udało mi się uzyskać (używając zadania ant) adres URL bez niestandardowego portu 80 dla HTTP.

Spojrzałem poprzez kod źródłowy Ant i zawęził błąd do URLConnection. Wygląda na to, że URLConnection nie rozpoznaje ruchu HTTP, ponieważ nie znajduje się na standardowym porcie, mimo że protokół jest określony jako HTTP. Wąchałem ruch za pomocą WireShark i strona ładuje się poprawnie w poprzek przewodu, ale nadal dostaje FileNotFoundException.

Oto przykład, w którym zobaczysz błąd(z adresem URL zmienionym w celu ochrony niewinnych). Błąd jest rzucony na połączenie.getInputStream();

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

    public class TestGet {
    private static URL source; 
    public static void main(String[] args) {
        doGet();
    }
    public static void doGet() {
            try {
            source = new URL("http", "test.com", 7925,
                    "/services/index.html");
            URLConnection connection = source.openConnection();
            connection.connect();
            InputStream is = connection.getInputStream();
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }

}
Author: martin clayton, 2009-06-03

8 answers

Sprawdź kod odpowiedzi zwracany przez serwer

 7
Author: objects,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 03:19:51

ODPOWIEDŹ na moje żądanie HTTP wróciła z kodem stanu 404, co spowodowało, że wywołanie getInputStream () wywołało wywołanie FileNotFoundException. Nadal chciałem przeczytać treść odpowiedzi, więc musiałem użyć innej metody: HttpURLConnection#getErrorStream () .

Oto fragment javadoc getErrorStream ():

Zwraca strumień błędu, jeśli połączenie nie powiodło się, ale serwer wysłał niemniej jednak przydatne dane. Typowy przykład gdy serwer HTTP odpowiada 404, co spowoduje a FileNotFoundException to be throwed w connect, ale serwer wysłał Strona pomocy HTML z sugestiami co do co robić.

Przykład użycia:

public static String httpGet(String url) {
    HttpURLConnection con = null;
    InputStream is = null;
    try {
        con = (HttpURLConnection) new URL(url).openConnection();
        con.connect();

        //4xx: client error, 5xx: server error. See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.
        boolean isError = con.getResponseCode() >= 400;
        //In HTTP error cases, HttpURLConnection only gives you the input stream via #getErrorStream().
        is = isError ? con.getErrorStream() : con.getInputStream();

        String contentEncoding = con.getContentEncoding() != null ? con.getContentEncoding() : "UTF-8";
        return IOUtils.toString(is, contentEncoding); //Apache Commons IO
    } catch (Exception e) {
        throw new IllegalStateException(e);
    } finally {
        //Note: Closing the InputStream manually may be unnecessary, depending on the implementation of HttpURLConnection#disconnect(). Sun/Oracle's implementation does close it for you in said method.
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                throw new IllegalStateException(e);
            }
        }
        if (con != null) {
            con.disconnect();
        }
    }
}
 45
Author: bcody,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-31 17:12:00

To stary wątek, ale miałem podobny problem i znalazłem rozwiązanie, którego tu nie ma.

Otrzymałem stronę w przeglądarce, ale dostałem 404, gdy próbowałem uzyskać do niej dostęp za pośrednictwem HttpURLConnection. Adres URL, do którego próbowałem uzyskać dostęp, zawierał numer portu. Kiedy próbowałem go bez numeru portu, pomyślnie dostałem fałszywą stronę przez HttpURLConnection. Więc wydawało się, że niestandardowy port był problemem.

Zacząłem myśleć, że dostęp jest ograniczony., i w pewnym sensie tak było. Moim rozwiązaniem było to, że musiałem powiedzieć serwerowi User-Agent, a także określić typy plików, których oczekuję. Próbuję przeczytać A.plik json, więc pomyślałem, że typ pliku może być również niezbędną specyfikacją.

Dodałem te linijki i w końcu zadziałało:

httpConnection.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
httpConnection.setRequestProperty("Accept","*/*");
 19
Author: Jessica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 01:16:45

Wiem, że to stary wątek, ale znalazłem rozwiązanie nie wymienione nigdzie tutaj.

Próbowałem pobrać dane w formacie json z serwletu J2EE na porcie 8080, ale otrzymywałem błąd file not found. Udało mi się pobrać te same dane json z serwera php działającego na porcie 80.

Okazuje się, że w servlecie musiałem zmienić dogeta na doPost.

Mam nadzieję, że to komuś pomoże.

 2
Author: NullPointer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-10 12:17:41

Próbowałem tego lokalnie-używając podanego kodu-i nie dostaję FileNotFoundException, chyba że serwer zwraca odpowiedź o statusie 404.

Czy jesteś pewien, że łączysz się z serwerem, z którym zamierzasz się łączyć? Czy jest szansa, że łączysz się z innym serwerem? (Zwracam uwagę, że numer portu w kodzie nie pasuje do numeru portu w linku)

 0
Author: Daniel Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 01:58:24

Natknąłem się na podobny problem, ale powód wydaje się być inny, oto ślad wyjątku:

java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1
    at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1491)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1485)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139)
    at com.doitnext.loadmonger.HttpExecution.getBody(HttpExecution.java:85)
    at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:214)
    at com.doitnext.loadmonger.ClientWorker.run(ClientWorker.java:126)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1434)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
    at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:166)
    ... 2 more

Wydaje się więc, że samo uzyskanie kodu odpowiedzi spowoduje połączenie URL z callGetInputStream.

 0
Author: Steve Owens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-30 00:03:37

Wiem, że to stary wątek, ale zauważyłem coś na tym, więc pomyślałem, że po prostu go tam wrzucę.

Jak wspomniała Jessica, ten wyjątek jest wyrzucany przy użyciu niestandardowego portu.

Wydaje się, że zdarza się to tylko podczas korzystania z DNS. Jeśli używam numeru IP mogę podać numer portu i wszystko działa dobrze.

 0
Author: Zyga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 08:42:52

Możesz użyć OkHttp :

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}
 0
Author: serv-inc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-20 15:20:15