Я пытаюсь выполнить HTTP GET, используя объект HttpURLConnection в Android.Android HttpURLConnection получает код ответа HTTP 301
UPDATE
Я попытался подключения к другому серверу. Это также размещено в Cloud 9 (c9.io), а также возвращает ответ json. На этот раз я не получаю 301 переадресацию, но я получаю фактический ответ, который должен отправить сервер.
Поскольку это означает, что проблема локализована на сервере, я реорганизовал следующие разделы, чтобы сфокусировать чтение на связанной с сервером информации. Информация, связанная с Android, была перенесена в конец вопроса.
Где я подключаю:
- сервера развития на Cloud9
- Использование Laravel Framework 5.2 (мы не можем обновить до 5.3 в это время, из-за неподдерживаемые зависимости проекта)
- Сервера должен вернуть ответ JSON
- Если я подключаюсь к одному и тому же URL-адресу через браузер, я получаю правильный ответ (строка JSON. Требуемые HTTP-заголовки и код ответа HTTP «200»)
Где я подключаю ОТ
- Android телефон (OnePlus 3, на Android 6.0)
- Compile SDK версии: 23
- Использование инструментов сборки: "23.0.3"
- Использование Min SDK verion: 19
- Использование целевой версии SDK: 22
- Я подключенg используя объект HttpURLConnection, используя HTTP метод 'GET'
HTTP Response на Android
Когда я запускаю мой код я получаю феллинг результат с сервера:
Код ответа HTTP является 301
, но сообщение null
.
- Новый URL-адрес точно такой же, но с использованием HTTPS. Кажется, сервер каким-то образом заставляет шифрование SSL/TSL. Что делает не происходит при доступе к HTTP из браузера.
заголовок HTTP (на Android):
- дата => Вт, 4 октября 2016 5:56:26 GMT
- место =>https://domain.com/route/ (я изменил этот бит)
- содержание -length => 382
- content-type => text/html; кодировка = изо-8859-1
- X-BACKEND => Приложения-прокси
- X-Android-Selected-Protocol => HTTP/1.1
- X-Android-Сент-Миллис => 1475560583894
- X -Android-Received-Миллис => 1475560585637
- X-Android-Response-Source => NETWORK 301
- нуль => HTTP/1.1 301
Другие данные
- Поскольку сервер хочет, чтобы Android использовал HTTPS, я пробовал модифицировать код для использования HTTPS (HttpsURLConnection). Это может и не решить проблема, но я не могу проверить это, так как я получаю раздражающую ошибку
SSL handshake failed
. Плюс я не нуждаюсь в шифровании в этом приложении, поэтому я не хочу решать проблемы, возникающие с ним. - Это все работает в объекте AsyncTask (так как Android становится мрачным, когда вы пытаетесь использовать сетевое соединение в основном потоке).
- Возможно, настройка нового сервера (за пределами Cloud 9 и без SSL/TSL) может быть вариантом, но я не хочу этого делать, поскольку это потребует много времени.
- Я попытался подключиться к другому серверу Cloud 9 (который также возвращает ответ json), используя тот же самый код, и все работает правильно. Это говорит о том, что проблема возникает из-за ошибки HTPP 301.
Я попытаюсь поделиться с вами любой другой информацией, которая может потребоваться, чтобы ответить на мой вопрос!
Родной вещи Android (переехал на UPDATE, см.выше)
Содержание ответа кажется быть неполным JSON:
{ 'status':'ERROR'
Примечание Я не забыл о закрытии }
характер, это то, что на самом деле содержит ответ. Это вводится где-то неизвестным (мне) во время рабочего процесса. Когда я беру HTTP-запрос (используя Charles на моем ПК, который настроен как прокси для подключения Wi-Fi моего телефона), это содержимое (как и ожидалось) простой HTML, указывающий вам перенаправить (код 301 HTPP) на новый маршрут ,
Недопустимый код JSON (см. Выше) не существует, но действителен HTML есть.
Это может означать, что недействительный JSON появляется где-то внутри моего кода (а не на сервере или на транспорте). Но в моем приложении нет кода, который генерирует строку JSON, не говоря уже о введении ее в ответ, который я обрабатываю.
Код для HttpURLConnection
this.setURL(ruta); //gets correct url
HttpURLConnection cxn = (HttpURLConnection) this.getURL().openConnection(); //init
cxn.setRequestMethod("GET"); //use HTTP GET verb
cxn.setUseCaches(false); //no cache
cxn.setRequestProperty("Cache-Control", "no-cache"); //even less cache
cxn.setDoOutput(false); //only true in POST/PUT requests
cxn.setRequestProperty("Connection","keep-alive");
cxn.setRequestProperty("DNT", "1"); //TEMP
cxn.setInstanceFollowRedirects(true); //should follow redirects
cxn.setRequestProperty("charset", "utf-8");
Код для чтения результата
int status_code = cxn.getResponseCode();
InputStream responseStream = new BufferedInputStream(cxn.getInputStream());
BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
String line = "";
StringBuilder stringBuilder = new StringBuilder();
while ((line = responseStreamReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
responseStreamReader.close();
String response = stringBuilder.toString();
cxn.disconnect();
'' Content-Type "," application/x-www-form-urlencoded ");' ???? Для запроса GET? Я предлагаю также отказаться от всех других свойств запроса. – greenapps
Имея проблемы с получением правильных данных, я ожидал, что вы опубликуете код, который его читает. Но вы этого не сделали. – greenapps
Просто добавил код для этого, в конце вопроса. Тем не менее (как я объяснил в предыдущем обновлении) я могу получить правильные данные с других серверов. @greenapps –