Java HttpUrlConnection выбрасывает соединение отказано

Я знаю, что есть несколько вопросов по этой теме. Но я не нашел ответа ни в одном из них.

Я пытаюсь открыть соединение с моим локальным сервером, но я все время отказываюсь от связи.

У меня работает сервер, и я проверил соединение с браузером и с приложением Google, которое называется Postman, и оно работает.

Он не работает при открытии соединения, как будто там нет ничего, к которому можно подключиться. или что-то блокирует соединение? Я тестировал с брандмауэром и антивирусом, не повезло.

тестирование в Postman URL возвращает пользователя так, как он должен...

Если я заменил url на "http://www.google.com, он работает нормально.

вот мой код:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 *
 * @author Gabriel
 */
public class HttpConnection {

    public HttpConnection() {

    }

    public void makeRequest() throws MalformedURLException, IOException {

        String url = "http://localhost:8000/users/1";

    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    // optional default is GET
    con.setRequestMethod("GET");

    //add request header
    con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36");
        con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        con.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
        con.setRequestProperty("Accept-Language", "en-US,en;q=0.8,es;q=0.6");
        con.setRequestProperty("Connection", "keep-alive");
        con.setRequestProperty("Host", "localhost:8000");

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'GET' request to URL : " + url);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
    }
    in.close();

    //print result
    System.out.println(response.toString());


    }
}

Ответ 1

У меня есть аналогичный код, который работает, но мой заголовок запроса намного проще. В основном просто:

con.setRequestProperty("User-Agent", "Mozilla/5.0");

Если упрощение заголовка не помогает, я бы захватил трафик при использовании вашего браузера с чем-то вроде скрипача, а затем сделав запрос таким же.

Ответ 2

Я расскажу о том, что может быть проблемой. Возможно, проблема с IPv4/IPv6.

Если да, то здесь два возможных решения

  • Если сервер только прослушивает адрес ipv6, измените его на прослушивание ipv4.
  • Если сервер прослушивает ipv4, заставьте Java использовать ipv4 с java.net.preferIPv4Stack=true

Ответ 3

Вы можете попробовать внедрить CORS в API, который вы пытаетесь подключиться, установив свойство access-control-allow-origin:* в заголовок ответа.

Ответ 4

Код хорош и отлично работает. Теперь проблема должна быть связана с транспортной или сетевой частью. Я хочу сказать, что вы не запрашиваете правильный сервер. Если вы используете 127.0.0.1 вместо localhost, я думаю, что у вас не будет проблемы. Итак, мой гость будет, что у вас есть проблема в /etc/hosts или C:\Windows\System32\drivers\etc\hosts.

Я советую вам попробовать простой тест: ping имя хоста и проверить вывод, если ip-адрес хорош.

Ответ 5

Ну, положите http://localhost:8000/users/1 в свой веб-браузер и что вы получите? Простая ошибка Connection Refused. Это не ты, это сайт. Кроме того, Url возвращает веб-сайты с использованием Protocol Identifiers(http://, https://), Ending Domains(.com, .edu, .gov), что также является еще одной причиной, по которой вы получаете сообщение об ошибке.

Ответ 6

Вы упомянули, что вы открыли соединение с вашим "локальным сервером", Я предполагаю, что вы делаете это на том же компьютере, на котором размещен сервер?

  • Попробуйте открыть подключение к локальному серверу с помощью другого компьютера.

Ответ 7

Я столкнулся с такой же проблемой. Используйте это вместо localhost:

http://[::1]:8000/index.php