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

如何用JavaScript获取text/html类型第三方网站响应?解决CORB拦截

解决方案:改用NCBI官方API替代直接请求PubMed网页

问题根源

  1. 你直接请求的PubMed主站是面向浏览器访问的网页服务,不支持JSONP或前端跨域请求:它只会返回text/html内容,不会处理JSONP要求的callback参数生成JS格式响应,所以浏览器触发CORB拦截。
  2. 前端设置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:指定操作的数据库是PubMed
    • retmode=json:强制返回JSON格式,避免CORB问题
    • retmax:控制返回结果的数量,按需调整
  • 如果需要获取具体文献的详细内容,可以接着调用ESummary接口,传入获取到的PMID列表。

为什么不能直接请求PubMed网页?

PubMed主站的设计目标是给用户浏览,而非程序调用。它不会解析callback参数生成JSONP响应,也没有配置CORS允许前端跨域读取HTML内容,所以前端直接请求必然会触发浏览器的跨域拦截机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:43:07