Невозможно получить ответ 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);
                }
            }

я получаю IO Exception

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 в качестве ответа.

5 ответов

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

Для: 400: -

Вы отправляете стратегию в виде мобильногоz вместо мобильного

+ Изменить

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

в

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

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

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

См.: Как разобрать этот ответ JSON в JAVA

Спасибо @ JB Низет

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

            InputStream is = null;
            if (conn.getResponseCode() == 400)
            {

                is = conn.getErrorStream();
                error = true;
            } else
            {
                is = conn.getInputStream();
            }

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

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

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

    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, как показано ниже:

Ошибка URLConnection - java.io.IOException: сервер вернул код ответа HTTP: 400 для URL

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

Другие вопросы по тегам