在URLConnection上使用getInputStream()时的ProtocolException

时间:2015-07-02 10:50:00

标签: java android xml urlconnection

编辑:导致错误的事情是url变量声明中的拼写错误。给出正确的输入,提供的代码是有效的。有关详细信息,请参阅我的回答。

原始问题:我正在处理定期向某个网络服务器发送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())。

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

注意:这类似于其他一些问题,但是我无法解决我的问题。

2 个答案:

答案 0 :(得分: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变量包含MAC地址,:%xx类型的内容替换

答案 1 :(得分:0)

您正在连接到SSH服务器,而不是HTTP服务器。

ng-blur="some task"上没有发生的原因是connect()实际上没有连接。如有必要,您提到的其他方法也可以。