Groovy使用RESTClient下载CSV返回网页内容的解决方案
问题根因
脚本返回网页而非预期CSV文件,通常由以下问题导致:
- RESTClient初始化时baseUrl拼写错误:现有代码中
https:test.com缺少双斜杠,实际请求会指向错误地址返回默认网页 - 未指定正确的接收类型:使用
ContentType.ANY时,客户端会根据响应头自动解析内容,若服务端返回的头带text/html标识,会直接将响应作为网页文本处理,不会保留文件二进制流 - 未模拟浏览器请求特征:多数业务站点会校验
User-Agent、Accept请求头,非浏览器标识的请求会被拦截,返回预览页/登录跳转页而非文件流 - 未开启自动重定向:CSV下载接口多数会做302跳转,不跟随重定向会拿到中间跳转页的HTML内容
修复方案
按以下步骤调整代码即可正常下载:
- 修正baseUrl拼写,补全
https://前缀 - 强制使用二进制类型接收响应,避免RESTClient自动做文本解析转换
- 显式添加浏览器请求头,明确告知服务端需要接收CSV格式内容
- 开启自动重定向配置,跟随下载接口的跳转逻辑
- 直接从响应中取二进制流写入本地文件,不要直接打印响应对象
修正后的可运行代码如下:
import groovyx.net.http.RESTClient import static groovyx.net.http.ContentType.BINARY import java.nio.file.Files import static java.nio.file.StandardCopyOption.REPLACE_EXISTING class RestCheck { static void main(def args) { def sUserName = 'tqqq' def sPassword = 'qww' // 修正baseUrl拼写错误 def client = new RESTClient('https://test.com') def path = "/changedata" client.setProxy('proxy.help.org' , 8080,'http') client.auth.basic sUserName, sPassword // 开启自动跟随重定向 client.followRedirects = true // 若目标站点使用自签SSL证书,可放开下面这行忽略证书校验 // client.ignoreSSLIssues() try { def resp = client.get( path: path, contentType: BINARY, // 强制按二进制流接收,不做自动文本解析 headers: [ // 模拟浏览器UA,避免被站点拦截返回网页 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', // 明确声明可接收的内容类型为CSV 'Accept': 'text/csv,application/csv,application/octet-stream,*/*' ] ) assert resp.status == 200: "请求异常,状态码:${resp.status}" // 定义本地文件保存路径 def savePath = new File('./download_data.csv').toPath() // 将响应流写入本地文件 Files.copy(resp.getData(), savePath, REPLACE_EXISTING) println "CSV下载完成,文件保存路径:${savePath.toAbsolutePath()}" } catch(Exception e) { e.printStackTrace() } } }
额外排查点
如果调整后仍返回网页内容,按以下顺序排查:
- 打印响应的状态码与
Content-Type响应头,若为3xx状态码需确认跳转地址是否要求额外携带参数、cookie;若为200但Content-Type为text/html,大概率是认证未通过、UA被拦截,需核对账号密码,补充站点要求的referer、token等必填请求头 - 确认代理配置正常,部分代理拦截HTTPS请求时会返回认证要求的HTML页面
- 打开浏览器F12网络面板,对比浏览器正常下载时的请求参数、请求头、cookie,与脚本请求逐一比对补全缺失项
内容的提问来源于stack exchange,提问作者Rajar R
相关产品推荐
相关产品推荐

