2016-10-04 2 views
1

Я пытаюсь выполнить 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.

  1. Новый 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

Другие данные

  1. Поскольку сервер хочет, чтобы Android использовал HTTPS, я пробовал модифицировать код для использования HTTPS (HttpsURLConnection). Это может и не решить проблема, но я не могу проверить это, так как я получаю раздражающую ошибку SSL handshake failed. Плюс я не нуждаюсь в шифровании в этом приложении, поэтому я не хочу решать проблемы, возникающие с ним.
  2. Это все работает в объекте AsyncTask (так как Android становится мрачным, когда вы пытаетесь использовать сетевое соединение в основном потоке).
  3. Возможно, настройка нового сервера (за пределами Cloud 9 и без SSL/TSL) может быть вариантом, но я не хочу этого делать, поскольку это потребует много времени.
  4. Я попытался подключиться к другому серверу 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(); 
+2

'' Content-Type "," application/x-www-form-urlencoded ");' ???? Для запроса GET? Я предлагаю также отказаться от всех других свойств запроса. – greenapps

+0

Имея проблемы с получением правильных данных, я ожидал, что вы опубликуете код, который его читает. Но вы этого не сделали. – greenapps

+0

Просто добавил код для этого, в конце вопроса. Тем не менее (как я объяснил в предыдущем обновлении) я могу получить правильные данные с других серверов. @greenapps –

ответ

1

Удалить код, который вы использовали для создания HttpURLConnection и попытаться с этим:

URL url; 
HttpURLConnection urlConnection = null; 
try { 
    url = new URL("http://www.domain.com/index.aspx?parameter1=X&parameter2=X"); //Use your url and add the GET parameters 

    urlConnection = (HttpURLConnection) url.openConnection(); 

    urlConnection.setInstanceFollowRedirects(false); /* added line */ 

    InputStream in = urlConnection.getInputStream(); 

    InputStreamReader isw = new InputStreamReader(in); 

    int data = isw.read(); 
    while (data != -1) { 
     char current = (char) data; 
     data = isw.read(); 
     System.out.print(current); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (urlConnection != null) { 
     urlConnection.disconnect(); 
    }  
} 

Это должно быть все, что вам нужно установить для вашего запроса GET.

EDIT:

Я проверил WebService с помощью Volley, вот код, который я использовал для того, чтобы получить ответ WebService:

public class MainActivity extends AppCompatActivity { 

    public String response; 
    TextView textView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    textView = (TextView) findViewById(R.id.rTextView); 

    RequestQueue queue = Volley.newRequestQueue(this); 
    String url = "yourWebserviceUrl"; 

    // Request a string response from the provided URL. 
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
     new Response.Listener <String>() { 
     @Override 
     public void onResponse(String response) { 
      textView.setText("Response is: " + response); 
     } 
     }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      textView.setText("That didn't work!"); 
     } 
     }); 
    // Add the request to the RequestQueue. 
    queue.add(stringRequest); 

    } 

} 

И это ответ, который я получил :

{"status":"ok","found":false,"extra":"App\\Scanners"} 
+0

Я закрыл свой компьютер на сегодня. Я попробую это через несколько часов! (срок подходит все ближе и ближе) –

+0

@PabloKvitca надеется, что это сработает! :) Дайте мне знать, если вы найдете какие-либо проблемы с кодом! – Signo

+0

Я пробовал это, код работает правильно. Но проблема сохраняется. Я получаю необъяснимый ответ HTTP 301 от сервера –

Смежные вопросы