2016-06-16 3 views
0

Я пытаюсь прочитать ответ googleapi с помощью java URLConnection.Невозможно получить ответ JSON от 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 в качестве ответа.

+0

«Недопустимое значение строки:„mobilez“Допустимые значения:. [Настольный, мобильный]»: Сообщение ясно достаточно –

+1

Вы отправляете mobilez вместо мобильного я думаю. проверьте мой ответ ниже –

+1

Пожалуйста, добавьте к вопросу, что ошибка - это то, что вы хотите в результате, но формат должен быть JSON. В противном случае люди пытаются помочь вам попробовать HTTP/200 с URL-адресом, который не разрешает ;-) – Dilettant

ответ

0

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

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

+0

Да, хозяин примера ошибочен, показывает, когда используется правильный параметр molie. – Dilettant

+0

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

1

Для: 400: -

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

Изменить

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

уведомление Зет в конце вашего URL

Чтобы захватить JSON ответ:

См: How to Parse this JSON Response in JAVA

+0

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

2

В ролях подключения к HTTP (S) URLConnection, и вызовите getErrorStream(), чтобы получить поток в случае ошибки.

+0

Спасибо, это сработало. InputStream is = null; if (conn.getResponseCode() == 400) { is = conn.getErrorStream(); error = true; } else { is = conn.getInputStream(); } –

0

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

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"))); 

Посмотреть оригинальный ответ here

См подобные SO вопросы, как показано ниже:

URLConnection Error - java.io.IOException: Server returned HTTP response code: 400 for URL

Server returned HTTP response code: 400

0

чем ks @ JB Nizet

Он работал, как я пробовал читать Error Stream.

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

       is = conn.getErrorStream(); 
       error = true; 
      } else 
      { 
       is = conn.getInputStream(); 
      } 
Смежные вопросы