2014-09-16 4 views
0

Я пытаюсь получить данные с помощью php-скрипта. Я использую для этого метод HttpURLConnection и GET. Самое странное здесь, что проблема возникает только для Android. Я просто попробовал это на eclipse для java, и он отлично работал. Он также работал, когда я был на моем локальном хосте. Нет, что я пытаюсь получить данные с онлайн-сервера, он больше не работает, ни на эмуляторе, ни на устройстве.HttpURLConnection android contentLength = -1

Вот функция:

public static JSONArray getData(String scriptName) { 

    int responseCode = -1; 
    JSONArray jsr = null; 

    try { 
     URL feedURL = new URL(BASE_URL + scriptName + ".php"); 
     HttpURLConnection connection = (HttpURLConnection) feedURL.openConnection(); 
     connection.setReadTimeout(10000/* milliseconds */); 
     connection.setRequestMethod("GET"); 
     connection.setDoInput(true); 
     connection.connect(); 

     responseCode = connection.getResponseCode(); 
     if (responseCode == HttpURLConnection.HTTP_OK) { 

      InputStream inputStream = connection.getInputStream(); 
      Reader reader = new InputStreamReader(inputStream); 
      int contentLength = connection.getContentLength(); 
      char[] charArray = new char[contentLength]; 
      reader.read(charArray); 
      String responseData = new String(charArray); 

      jsr = new JSONArray(responseData); 

     } 

    } catch (Exception e) { 
     Log.e(UnBunkerApplication.DEBUG_TAG, "Error : " + e.getMessage()); 
    } 

    return jsr; 
} 

Сгенерированный ошибка в том, что connection.getContentLength() возвращает -1. ... Таким образом, линия «новый символ [ContentLength] поймана сточный блока Константа base_url является онлайн URL папка, содержащая скрипты Когда он был Пойтинга на локальный, все было хорошо

Вот вызов метода:

public static void fillUsersListFromDataBase() { 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      JSONArray dataJSON = DataBase.getData("getAllUsers"); 
      User.fillUsers(dataJSON); 
     } 

    }); 

    t.start(); 

    try { 
     t.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

А вот разрешения:?

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.SEND_SMS" /> 

Любые мысли Спасибо

+0

Можете ли вы поймать ошибку и зарегистрировать ее, чтобы вы могли проверить ошибку создания соединения, если таковая имеется? – icbytes

+0

Ну, ошибки подключения не видно. ResponseCode == 200. Вот журнал: 1542-1564/be.simongenin.unbunker E/UnBunkerDebug: Ошибка: -1. –

ответ

0

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

  1. Ответ может быть заархивирован/gzipped.
  2. В ответе может использоваться заголовок Tranfer-Encoding: chunked, который типичен для ответов HTTP/1.1.
  3. Похоже, вы предполагаете, что 1 байт = 1 символ и создание массива символов с количеством байтов. Это не всегда будет верно, если ваш сервер может отправлять несколько байтовых символов (например, utf-8)

В обоих случаях лучшим способом является чтение потока до истощения.

BufferedReader br = new BufferedReader(reader); 
StringBuilder sb = new StringBuilder(); 
while ((line = br.readLine()) != null) { 
     sb.append(line); 
} 
processJson(sb.toString()); 
Смежные вопросы