2015-07-02 6 views
1

Редактировать: Вещь, вызывающая ошибку, была опечаткой в ​​объявлении переменной url. Приведенный код работает, учитывая правильный ввод. См. Мой ответ для деталей.ProtocolException при использовании getInputStream() в URLConnection

Вопрос: Я работаю над приложением, которое регулярно отправляет запрос GET на определенный веб-сервер.

Я пробовал и проверял URL и запрос в браузере, и я получаю информацию в формате XML, как и ожидалось.

URL/query выглядит следующим образом: http://foo.bar.com:8080/bla/ha/get_stuff?param1=gargle&param2=blurp

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

Однако при вызове getInputStream() на моем URLConnection объекта, я получаю следующее исключение:

java.net.ProtocolException: Неожиданное строку состояния: SSH-2,0-OpenSSH_5.9p1 Debian-5ubuntu1.1

Вызов connect() на том же объекте не вызывает никаких исключений (однако другие методы, такие как getContent(), do).

getContentType()null.

Я использую AsyncTask для сбора и отображения данных (отображение работает отлично).

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

Это потому, что данные находятся в формате XML?

Если да, то как еще я должен получить к нему доступ?

Код

class GetPositionTask extends AsyncTask<Void, Void, String> { 
    @Override 
    protected String doInBackground(Void... params) { 
     String url = "http://foo.bar.com/8080/bla/ha/get_stuff"; 
     String charset = "UTF-8"; 
     String param1 = "gargle"; 
     String param2 = "blurp"; 
     try { 
      String query = String.format("param1=%s&param2=%s", 
        URLEncoder.encode(param1, charset), 
        URLEncoder.encode(param2, charset)); 

      Authenticator.setDefault(new Authenticator() { 
       @Override 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("userName", "passWord".toCharArray()); 
       } 
      }); 

      URLConnection urlConnection = new URL(url + "?" + query).openConnection(); 
      urlConnection.setRequestProperty("Accept-Charset", charset); 
      InputStream response = urlConnection.getInputStream(); //Commenting this out prevents exception 

      return "Made it through!"; // Never reaches this 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      return "Exception in GetPositionTask"; 
     } 

    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 

     TextView textView = (TextView) findViewById(R.id.textView); 
     textView.setText(s); 
    } 
} 

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

ответ

1

Причина была простой тип в url строку, которая должна была быть

String url = "http://foo.bar.com:8080/bla/ha/get_stuff"; 

вместо

String url = "http://foo.bar.com/8080/bla/ha/get_stuff"; 

Закрепление что опечатка сделал все это работать как шарм.

Интересно, хотя, когда я обойти всю конкатенацию и форматирование бизнеса, вставив полный URL/query в URL конструктора, как показано ниже, он все еще работал (хотя URLEncoder#encode вызовов сделали переключатель некоторых : символов в param2).

URLConnection urlConnection = new URL("http://foo.bar.com:8080/bla/ha/get_stuff?param1=gurgle&param2=blurp").openConnection(); 

(в моем реальном случае, переменная param2 содержит МАС-адрес, и : «s были заменены на что-то типа %xx)

0

Вы подключаетесь к SSH-серверу, а не к HTTP-серверу.

Причина, по которой это не происходит на connect(), заключается в том, что connect() на самом деле не соединяется. Другие методы, которые вы упомянули, при необходимости.

+0

Забавных, что владелец сервера только указанный«выше XMP является ответ на запрос HTTP 'GET' [link]". Итак, я подключаюсь к SSH-серверу через HTTP-запрос? – Svj0hn

+0

Конечно, я имел в виду XML, а не XMP. Во всяком случае, если бы вы могли указать мне в правильном направлении, я был бы очень благодарен – Svj0hn