【问题标题】:Android HTTP request with specific port具有特定端口的 Android HTTP 请求
【发布时间】:2013-01-29 22:36:42
【问题描述】:

我正在尝试从 Shoutcast 服务器获取歌曲名称。所以,我的想法是在 Shoutcast 服务器的 7.html 页面上做一些正则表达式,但是我无法获得简单的 HttpGet 请求来接收 7.html 页面。我做错了什么?

如果我从链接中删除端口号,HttpGet 将毫无问题地运行,但我不会得到我的结果。

private class GetTrackInfo extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... Urls) {

        String url = urls[0];
        if(!url.contains("http://")) url = "http://" + url;
        url = url + "/7.html";
        HttpParams params = new BasicHttpParams();
        HttpClient httpclient = new DefaultHttpClient(params);
        HttpGet http = new HttpGet(url);
        HttpResponse response = null;
        try {
            response = httpclient.execute(http);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            response.getEntity().writeTo(out);
        } catch (IOException e) {
            e.printStackTrace();
        }        
        String res = out.toString();
        return res;
    }

    @Override
    protected void onPostExecute(String result) {
        Log.i("GetTrack", "Track result: " + result);
        String[] results = result.split(",");
        String track = results[results.length-1];
        fplayer.setStreamInfoTxt(track);
    }

}

作为一个错误,我得到:

01-29 23:28:10.461: W/System.err(962): org.Apache.http.client.ClientProtocolException 01-29 23:28:10.471: W/System.err(962): 在 org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:557) 01-29 23:28:10.471: W/System.err(962): 在 org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:487) 01-29 23:28:10.471: W/System.err(962): 在 org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:465) 01-29 23:28:10.471: W/System.err(962): 在 com.imsgroups.exyuradio.services.PlayerService$GetTrackInfo.doInBackground(PlayerService.Java:257) 01-29 23:28:10.471: W/System.err(962): 在 com.imsgroups.exyuradio.services.PlayerService$GetTrackInfo.doInBackground(PlayerService.Java:1) 01-29 23:28:10.481: W/System.err(962): 在 Android.os.AsyncTask$2.call(AsyncTask.Java:185) 01-29 23:28:10.481: W/System.err(962): 在 Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:305) 01-29 23:28:10.491: W/System.err(962): 在 Java.util.concurrent.FutureTask.run(FutureTask.Java:137) 01-29 23:28:10.491: W/System.err(962): 在 Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1068) 01-29 23:28:10.491: W/System.err(962): 在 Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:561) 01-29 23:28:10.491: W/System.err(962): 在 Java.lang.Thread.run(Thread.Java:1096) 01-29 23:28:10.491:W/System.err(962):原因:org.Apache.http.ProtocolException:服务器未能以有效的 HTTP 响应响应 01-29 23:28:10.511: W/System.err(962): 在 org.Apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.Java:93) 01-29 23:28:10.511: W/System.err(962): 在 org.Apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.Java:174) 01-29 23:28:10.511: W/System.err(962): 在 org.Apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.Java:179) 01-29 23:28:10.511: W/System.err(962): 在 org.Apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.Java:235) 01-29 23:28:10.522: W/System.err(962): 在 org.Apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.Java:259) 01-29 23:28:10.522: W/System.err(962): 在 org.Apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.Java:279) 01-29 23:28:10.522: W/System.err(962): 在 org.Apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.Java:121) 01-29 23:28:10.522: W/System.err(962): 在 org.Apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.Java:410) 01-29 23:28:10.541: W/System.err(962): 在 org.Apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.Java:555)

【问题讨论】:

  • 如果由于某种原因您无法使其正常工作,我建议您使用脚本服务器端来为您执行此操作,并返回正确的响应。 SHOUTcast 对 7.html 的响应应该没问题...我不确定您为什么会收到这些错误。但是,当您已经可以使用数据时,不要求助于从流本身中抓取数据,因为这非常低效。如果这是您的服务器,您也可以使用完整的 XML 数据。

标签: android http shoutcast icecast


【解决方案1】:

我设法弄明白了!我的String url 变量实际上有问题。 在用 URLEncode 编码这个字符串后,我看到我有 %0A%0D ,因为我从文件中获取了这些 url。 (%0A%0D 是用于转义和换行的字符,请参阅here 了解更多信息) 现在一切都像魅力一样运作!所以,伙计们,在发出 Http 请求之前,请务必仔细检查您的 url。

【讨论】:

    【解决方案2】:

    您正在修改变量url,但随后将原始参数传递给您的HttpGet

     HttpGet http = new HttpGet(urls[0]);
    

    因此,如果您的 urls[0] 上没有 http: 协议,则不会添加它。我想你想要以下 -

    HttpGet http = new HttpGet(url);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2011-03-01
    • 2014-08-13
    相关资源
    最近更新 更多