如何用JavaScript获取text/html类型第三方网站响应?解决CORB拦截
解决方案:改用NCBI官方API替代直接请求PubMed网页
问题根源
- 你直接请求的PubMed主站是面向浏览器访问的网页服务,不支持JSONP或前端跨域请求:它只会返回
text/html内容,不会处理JSONP要求的callback参数生成JS格式响应,所以浏览器触发CORB拦截。 - 前端设置
Access-Control-Allow-Origin请求头完全无效——这个头是服务端用来允许跨域的响应头,前端发送请求时加它没有任何作用。
正确做法:使用NCBI E-utilities API
NCBI提供了专门的程序访问接口E-utilities,支持返回JSON格式,且允许跨域请求。我们用ESearch接口来搜索PubMed内容:
调整后的代码
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> function makePubmedRequest() { const apiUrl = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi'; const searchTerm = 'hello'; // 你的搜索关键词 $.ajax({ url: apiUrl, type: 'GET', dataType: 'json', data: { db: 'pubmed', // 指定数据库为PubMed term: searchTerm, // 搜索关键词 retmode: 'json', // 指定返回JSON格式 retmax: 10, // 最多返回10条结果(可调整) api_key: '你的NCBI API密钥' // 可选,但建议添加,避免限流 }, success: function(response) { console.log('搜索结果:', response); // 这里可以处理返回的JSON数据,比如获取PMID列表 const pmids = response.idlist; console.log('匹配的PMID:', pmids); }, error: function(xhr, status, error) { console.error('请求失败:', status, error); } }); } // 发起请求 makePubmedRequest(); </script>
关键说明
- API密钥:可以在NCBI账号的API设置中生成,没有的话暂时可以不用,但频繁请求会被限流。
- 接口参数:
db=pubmed:指定操作的数据库是PubMedretmode=json:强制返回JSON格式,避免CORB问题retmax:控制返回结果的数量,按需调整
- 如果需要获取具体文献的详细内容,可以接着调用ESummary接口,传入获取到的PMID列表。
为什么不能直接请求PubMed网页?
PubMed主站的设计目标是给用户浏览,而非程序调用。它不会解析callback参数生成JSONP响应,也没有配置CORS允许前端跨域读取HTML内容,所以前端直接请求必然会触发浏览器的跨域拦截机制。
内容的提问来源于stack exchange,提问作者Muralikrishnan P
相关产品推荐
相关产品推荐

