如何在TypeScript中通过SSDP发送HTTP请求?遇404及localhost追加问题
我来帮你一步步排查这个问题,之前做Roku设备控制的时候也踩过类似的坑,咱们从几个关键方向入手:
1. 先搞定SSDP响应的地址解析问题
你遇到的请求串被追加localhost,大概率是代码里处理SSDP返回的LOCATION头时出了问题。Roku设备在SSDP响应里会直接给你完整的设备描述URL,比如http://192.168.x.x:8060/device-description.xml,你要做的就是直接用这个完整URL发GET请求,绝对不要手动把localhost和路径拼在一起。
检查下你的代码是不是误写了字符串拼接逻辑,比如写成了"http://localhost" + location_path,这会导致请求地址变成http://localhost/http://192.168.x.x:8060/...这种完全无效的地址,自然返回404。
2. 验证GET请求的路径和端口是否正确
Roku的设备描述接口路径是固定的/device-description.xml,端口默认是8060,这俩错一个都会404。你可以先绕开代码,手动测试:在同一局域网的浏览器里输入http://[你的Roku设备IP]:8060/device-description.xml,如果能看到XML格式的设备信息,说明地址没问题;如果浏览器也返回404,那大概率是Roku的外部控制权限没开。
3. 确认Roku设备的外部控制API已启用
Roku默认可能限制了外部设备的控制访问,这会导致即使地址正确也返回404:
- 打开Roku的设置菜单:依次进入
Settings > System > Advanced system settings > Control by mobile apps > Network access - 把权限设置为
Default或者Permissive(允许同一局域网的设备访问),然后重启Roku设备再试。
4. 检查SSDP搜索报文是否标准
如果SSDP搜索本身没拿到正确的Roku响应,后续的GET请求肯定会出错。标准的Roku SSDP搜索需要发送UDP报文到239.255.255.250:1900,报文内容要准确:
M-SEARCH * HTTP/1.1 HOST: 239.255.255.250:1900 MAN: "ssdp:discover" MX: 3 ST: roku:ecp
重点注意ST字段是roku:ecp,不要用成其他服务类型,不然搜不到Roku设备,只能拿到无效的地址。
5. 排查代码里的URL处理逻辑
如果是用了框架或者自定义工具函数处理URL,可能会自动追加localhost。比如在Python里用urljoin的时候,要是不小心把基础URL设成了localhost,就会把路径拼错:
# 错误示例:会把路径拼接到localhost后面 wrong_url = urljoin("http://localhost", "/device-description.xml") # 正确示例:直接用SSDP返回的完整LOCATION URL correct_url = "http://192.168.1.100:8060/device-description.xml"
检查下你的代码有没有这类自动修改URL的逻辑,把它去掉就行。
内容的提问来源于stack exchange,提问作者Jason Smith

