ASP.NET重定向外部MP3返回HTML,Android如何直接获取文件?
解决Android客户端获取MP3文件时收到重定向HTML的问题
嘿,这个问题我之前也碰到过!原因是服务器返回的是302临时重定向响应,而你的Android HTTP客户端没有自动跟随这个跳转,所以拿到的是跳转提示的HTML页面,而不是实际的MP3文件。下面给你几个可行的解决办法:
1. 让HTTP客户端自动跟随重定向
大部分主流的Android HTTP库都支持自动跟随重定向,只需要确保相关配置开启:
用OkHttp实现(推荐)
OkHttp默认就会自动跟随重定向,如果你之前手动禁用了,重新开启即可:
OkHttpClient client = new OkHttpClient.Builder() .followRedirects(true) // 开启自动跟随重定向(默认值就是true) .followSslRedirects(true) // 确保HTTPS的重定向也能被跟随 .build(); Request request = new Request.Builder() .url("你的服务器接口URL") .build(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { // 获取MP3文件的输入流,后续可以保存到本地或直接播放 InputStream mp3Stream = response.body().byteStream(); // 这里添加你的流处理逻辑,比如写入文件 } } catch (IOException e) { e.printStackTrace(); }
用HttpURLConnection实现
HttpURLConnection需要手动开启重定向跟随:
URL apiUrl = new URL("你的服务器接口URL"); HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection(); connection.setInstanceFollowRedirects(true); // 开启自动跟随重定向 connection.setRequestMethod("GET"); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream mp3Stream = connection.getInputStream(); // 处理MP3流的逻辑 } connection.disconnect();
2. 手动处理重定向(如果不想依赖自动跟随)
如果需要更精细的控制,可以先请求服务器接口,判断重定向响应,再手动请求实际的MP3地址:
URL apiUrl = new URL("你的服务器接口URL"); HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection(); connection.setInstanceFollowRedirects(false); // 禁止自动跟随 connection.setRequestMethod("GET"); int responseCode = connection.getResponseCode(); // 检查是否是临时重定向(302)或永久重定向(301) if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP || responseCode == HttpURLConnection.HTTP_MOVED_PERM) { String actualMp3Url = connection.getHeaderField("Location"); // 直接请求实际的MP3地址 HttpURLConnection mp3Connection = (HttpURLConnection) new URL(actualMp3Url).openConnection(); if (mp3Connection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream mp3Stream = mp3Connection.getInputStream(); // 处理MP3文件 } mp3Connection.disconnect(); } connection.disconnect();
3. 服务器端调整(如果有权限修改服务器代码)
如果能修改服务器的代码,最好的方式是跳过重定向,直接返回MP3文件的字节流,这样客户端不需要处理跳转逻辑。比如在ASP.NET中可以这样写:
string mp3SourceUrl = "https://externalserver-100.mp3"; using (WebClient webClient = new WebClient()) { byte[] mp3Bytes = webClient.DownloadData(mp3SourceUrl); Response.ContentType = "audio/mpeg"; Response.OutputStream.Write(mp3Bytes, 0, mp3Bytes.Length); Response.End(); }
这样客户端请求服务器接口时,会直接收到MP3的字节流,不会再拿到重定向的HTML页面。
内容的提问来源于stack exchange,提问作者JustMe
相关产品推荐
相关产品推荐

