Сервер вернул код ответа HTTP: 400

Я пытаюсь получить InputStream из URL-адреса. URL-адрес может быть открыт из Firefox. Он возвращает json, и я установил надстройку для просмотра json в Firefox, чтобы я мог просматривать его там.

Итак, я попытался получить его с Java:

URL url = new URL(urlString);
URLConnection urlConnection = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

Но он генерирует исключение IOException в urlConnection.getInputStream().

Я также пробовал:

HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = url.openStream();

Но не повезло.

Любая информация ценна. Заранее спасибо.


person Tapas Bose    schedule 19.02.2012    source источник


Ответы (5)


Спасибо всем. Это странная проблема, но, наконец, я решил ее.

URL-адрес, который я запрашиваю,

http://api.themoviedb.org/2.1/Movie.search/en/json/api_key/a nightmare on elm street 

Теперь браузер заменяет пробелы между «кошмаром на улице Вязов» на «%20» внутри и анализирует. Вот почему запрошенный сервер может ответить на этот запрос. Но из Java я не заменил эти пробелы на «% 20», поэтому он превращается в неверный запрос, источник.

Теперь это работает.

BufferedReader reader = new BufferedReader(new InputStreamReader(((HttpURLConnection) (new URL(urlString)).openConnection()).getInputStream(), Charset.forName("UTF-8")));
person Tapas Bose    schedule 19.02.2012

У меня была аналогичная проблема, и мой URL был:

http://www.itmat.upenn.edu/assets/user-content/documents/ITMAT17. October 10 2017_.pdf

который явно содержал пробелы.

Это привело к тому, что сервер java.io.IOException Server вернул код ответа HTTP: 400 в следующем коде:

java.net.URL url = new URL(urlString);  
java.io.InputStream in = url.openStream();

Если вы скопируете приведенный выше URL-адрес и вставите его в браузер, вы поймете, что браузер добавляет «% 20» для пробелов. Поэтому я сделал это вручную со следующим кодом, и проблема решена.

if(urlString.contains(" "))
    urlString = urlString.replace(" ", "%20");

Полный код/ответ должен быть:

if(urlString.contains(" "))
    urlString = urlString.replace(" ", "%20");
java.net.URL url = new URL(urlString);  
java.io.InputStream in = url.openStream();
person harshainfo    schedule 28.02.2019

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

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


public class URLFetcher {

    public static void main(String[] args) throws Exception {
        URL myURL = new URL("http://www.paulsanwald.com/");
        HttpURLConnection connection = (HttpURLConnection) myURL.openConnection();
        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.connect();
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder results = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            results.append(line);
        }

        connection.disconnect();
        System.out.println(results.toString());
    }
}
person Paul Sanwald    schedule 19.02.2012

закодируйте параметры в URL следующим образом:

String messageText = URLEncoder.encode(messageText, "UTF-8");
person Mahmoud Saleh    schedule 04.02.2018

Я столкнулся с той же ошибкой. В моем случае это произошло из-за того, что токен sizjwt в заголовке был больше допустимого размера программным прокси-сервером мула. Одним из вариантов является увеличение размера допустимого размера заголовка в программном обеспечении для мулов или уменьшение размера токена путем удаления некоторых разрешений, назначенных идентификатору пользователя.

person Aneesh    schedule 19.07.2020