WedX - журнал о программировании и компьютерных науках

Не удалось получить ответ JSON от URLConnection

Я пытаюсь прочитать ответ от googleapi, используя java URLConnection.

В браузере, если я запрашиваю "https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url=https%3A%2F%2Fwww.zauq.se&strategy=mobilez"

я получаю ответ в формате JSON.

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "invalidParameter",
    "message": "Invalid string value: 'mobilez'. Allowed values: [desktop, mobile]",
    "locationType": "parameter",
    "location": "strategy"
   }
  ],
  "code": 400,
  "message": "Invalid string value: 'mobilez'. Allowed values: [desktop, mobile]"
 }
}

Но когда я использую следующий код.

URL url = null;
            System.setProperty("http.agent", "");

            url = new URL("https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url=https%3A%2F%2Fwww.zauq.se&strategy=mobilez");//"https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url=" + paramUrl + "&strategy=" + paramStrategy);
            URLConnection conn = url.openConnection();
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("User-Agent", "Mozilla/5.0");
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String strTemp = "";
            StringBuilder sb = new StringBuilder();

            while ((null != (strTemp = br.readLine())))
            {
                sb.append(strTemp);
                if (dump)
                {
                    System.out.println(strTemp);
                }
            }

я получаю исключение ввода-вывода

java.io.IOException: Server returned HTTP response code: 400 for URL: https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url=https%3A%2F%2Fwww.zauq.se&strategy=mobilez
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1627)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at amirTest.PageSpeedCheck.main(PageSpeedCheck.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

/ но мне нужно получить ответ JSON.

Пожалуйста, предложите мне изменения, которые необходимо внести, чтобы получить JSON в качестве ответа.


  • Недопустимое строковое значение: 'mobilez'. Допустимые значения: [настольный компьютер, мобильный телефон]: сообщение достаточно ясное. 16.06.2016
  • Вы отправляете mobilez вместо мобильного, я думаю. проверьте мой ответ ниже 16.06.2016
  • Пожалуйста, добавьте к вопросу, что в результате вы хотите получить ошибку, но формат должен быть JSON. В противном случае люди попытаются помочь вам попробовать HTTP/200 с URL-адресом, который не позволяет ;-) 16.06.2016

Ответы:


1

Приведите соединение к Http(s)URLConnection и вызовите getErrorStream() для получения потока в случае ошибки.

16.06.2016
  • Спасибо, это сработало. Входной поток равен нулю; если (conn.getResponseCode() == 400) { is = conn.getErrorStream(); ошибка = правда; } еще { is = conn.getInputStream(); } 16.06.2016

  • 2

    Для : 400 :-

    Вы отправляете стратегию как mobilez вместо mobile

    Изменять

    https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url=https%3A%2F%2Fwww.zauq.se&strategy=mobilez

    to

    https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url=https%3A%2F%2Fwww.zauq.se&strategy=mobile

    обратите внимание на z в конце вашего URL

    Чтобы получить ответ JSON:

    См.: Как проанализировать этот ответ JSON в JAVA

    16.06.2016
  • я знаю, что это неправильно, значит, я хотел получить сообщение об ошибке. но это сообщение об ошибке должно быть похоже на то, которое мы получаем в браузере, ответ JSON. 16.06.2016

  • 3

    Параметры, используемые в вашем вызове API, неверны, поэтому сервер возвращает код состояния 400. Это означает, что это ПЛОХОЙ запрос.

    mobilz должен быть мобильным. Также URL-адрес, который вы используете, неверен.

    16.06.2016
  • Да, образец хоста неправильный, отображается при использовании правильного параметра моли. 16.06.2016
  • я знаю, что это неправильно, значит, я хотел получить сообщение об ошибке. но это сообщение об ошибке должно быть похоже на то, которое мы получаем в браузере, ответ JSON. 16.06.2016

  • 4

    Вам просто нужно изменить код, как показано ниже:

        BufferedReader reader = new BufferedReader(new InputStreamReader(((HttpURLConnection) (new URL("https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url=https%3A%2F%2Fwww.zauq.se&strategy=mobilez")).openConnection())
    .getInputStream(), Charset.forName("UTF-8")));
    

    См. исходный ответ здесь

    См. аналогичные вопросы SO, как показано ниже:

    Ошибка подключения URL - java.io.IOException: сервер возвращенный код ответа HTTP: 400 для URL

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

    16.06.2016

    5

    Спасибо @ JB Nizet

    Это сработало, когда я попытался прочитать поток ошибок.

                InputStream is = null;
                if (conn.getResponseCode() == 400)
                {
    
                    is = conn.getErrorStream();
                    error = true;
                } else
                {
                    is = conn.getInputStream();
                }
    
    16.06.2016
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]