You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过QuickConnect ID调用Synology WebAPI登录失败求助

解决群晖QuickConnect API在Android中返回HTML而非JSON的问题

问题原因

PC浏览器调用群晖QuickConnect认证接口时能正常获取包含sid的JSON响应,但Android端使用HttpURLConnection调用时返回HTML跳转页面,核心原因是:

  1. 浏览器会自动处理重定向并发送符合服务器预期的请求头,而你的Android请求缺少关键请求头,被服务器判定为普通浏览器访问,返回了web登录页面。
  2. 虽然HttpURLConnection默认跟随重定向,但重定向过程中可能因请求头缺失导致服务器返回非API响应。

解决方案

1. 添加模拟浏览器的请求头

群晖服务器通过请求头识别请求类型,添加以下头信息模拟AJAX请求,让服务器返回JSON:
在makeHttpRequest方法中,连接建立前添加:

// 模拟桌面浏览器User-Agent
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");
// 指定接受JSON格式响应
urlConnection.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01");
// 标记为AJAX请求,避免返回HTML页面
urlConnection.setRequestProperty("X-Requested-With", "XMLHttpRequest");

2. 显式开启重定向跟随

确保HttpURLConnection自动处理重定向(默认开启,显式设置更稳妥):

urlConnection.setInstanceFollowRedirects(true);

3. 优化响应码处理

除了200状态码,还要处理重定向状态码(301/302),确保能读取重定向后的响应:

int responseCode = urlConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK || 
    responseCode == HttpURLConnection.HTTP_MOVED_TEMP || 
    responseCode == HttpURLConnection.HTTP_MOVED_PERM) {
    inputStream = urlConnection.getInputStream();
    jsonResponse = readFromStream(inputStream);
} else {
    Log.e(LOG_TAG, "Error response code: " + responseCode);
    // 读取错误流排查问题
    InputStream errorStream = urlConnection.getErrorStream();
    if (errorStream != null) {
        Log.e(LOG_TAG, "Error content: " + readFromStream(errorStream));
    }
}

4. 改用HTTPS(可选)

多数群晖设备现在默认使用HTTPS,将URL前缀从http://改为https://,避免HTTP到HTTPS的额外重定向。

修改后的完整makeHttpRequest方法

private static String makeHttpRequest(URL url,String method) throws IOException {
    String jsonResponse = "";
    if (url == null) {
        return jsonResponse;
    }
    HttpURLConnection urlConnection = null;
    InputStream inputStream = null;
    try {
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setReadTimeout(10000);
        urlConnection.setConnectTimeout(15000);
        urlConnection.setRequestMethod(method);
        
        // 开启重定向跟随
        urlConnection.setInstanceFollowRedirects(true);
        // 添加关键请求头
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");
        urlConnection.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01");
        urlConnection.setRequestProperty("X-Requested-With", "XMLHttpRequest");
        
        urlConnection.connect();
        
        // 处理200和重定向响应码
        int responseCode = urlConnection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK || 
            responseCode == HttpURLConnection.HTTP_MOVED_TEMP || 
            responseCode == HttpURLConnection.HTTP_MOVED_PERM) {
            inputStream = urlConnection.getInputStream();
            jsonResponse = readFromStream(inputStream);
        } else {
            Log.e(LOG_TAG, "Error response code: " + responseCode);
            Log.e(LOG_TAG, url.toString());
            // 读取错误流获取服务器反馈
            InputStream errorStream = urlConnection.getErrorStream();
            if (errorStream != null) {
                String errorContent = readFromStream(errorStream);
                Log.e(LOG_TAG, "Error response content: " + errorContent);
                errorStream.close();
            }
        }
    } catch(ConnectException e){
        throw e;
    } catch (IOException e) {
        Log.e(LOG_TAG, "Problem retrieving the JSON results.", e);
    } finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
        if (inputStream != null) {
            inputStream.close();
        }
    }
    return jsonResponse;
}

额外建议

  • 不要明文传密码:将account和passwd从URL参数改为POST请求体,避免敏感信息泄露。
  • 验证API版本:先调用SYNO.API.Info接口确认当前设备支持的SYNO.API.Auth版本,避免因版本不兼容导致错误。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:36:18