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

如何将College Football API响应自动填充至HTML Div标签?

解决方案:API数据填充至HTML Div及问题修复

核心问题分析

  • 前端fetch请求未携带Bearer授权头,导致API调用失败(你单独Python脚本能成功是因为加了授权,但前端没加)
  • 缺少用于展示API数据的HTML容器(Div标签)
  • favicon.ico的404是浏览器默认请求图标,属于无关错误,可忽略或添加图标文件解决

方案一:纯前端实现(适合快速测试)

步骤1:修改HTML,添加数据展示容器

在<body>末尾添加用于显示球员数据的Div:

<div id="playerData" style="margin-top: 20px; padding: 10px; border: 1px solid #eee;"></div>

步骤2:更新JavaScript的API调用逻辑

修改submitForm函数,添加授权头并实现数据渲染:

function submitForm() {
    // 获取输入值
    var firstName = document.getElementById('firstNameInput').value;
    var lastName = document.getElementById('lastNameInput').value;

    // 校验输入
    if (!firstName || !lastName) {
        alert('请输入完整的名字和姓氏');
        return;
    }

    // 构造API地址
    var apiEndpoint = `https://api.collegefootballdata.com/player/search?searchTerm=${encodeURIComponent(firstName)}%20${encodeURIComponent(lastName)}`;

    // 带授权头发起请求
    fetch(apiEndpoint, {
        headers: {
            'Authorization': 'Bearer YOUR_ACCESS_KEY_HERE' // 替换为你的密钥
        }
    })
    .then(response => {
        if (!response.ok) throw new Error(`请求失败:${response.status}`);
        return response.json();
    })
    .then(data => {
        const playerContainer = document.getElementById('playerData');
        // 清空旧数据
        playerContainer.innerHTML = '';

        if (data.length > 0) {
            // 遍历渲染每个球员信息
            data.forEach(player => {
                const playerCard = document.createElement('div');
                playerCard.style.border = '1px solid #ccc';
                playerCard.style.padding = '15px';
                playerCard.style.marginBottom = '10px';
                playerCard.innerHTML = `
                    <h3>${player.firstName} ${player.lastName}</h3>
                    <p><strong>学校:</strong>${player.school}</p>
                    <p><strong>位置:</strong>${player.position || '未记录'}</p>
                    <p><strong>毕业年份:</strong>${player.year || '未记录'}</p>
                `;
                playerContainer.appendChild(playerCard);
            });
        } else {
            playerContainer.innerHTML = '<p>未找到匹配的球员信息</p>';
        }
    })
    .catch(error => {
        console.error('错误:', error);
        document.getElementById('playerData').innerHTML = `<p>请求出错:${error.message}</p>`;
    });
}

注意:纯前端方案会暴露你的API密钥,仅用于测试,生产环境请用方案二。


方案二:Flask后端代理(安全推荐)

将API密钥保存在后端,前端请求自己的Flask接口,避免密钥泄露。

步骤1:编写Flask后端(app.py)

from flask import Flask, request, jsonify
import cfbd

app = Flask(__name__)

# 配置API密钥(仅后端可见)
configuration = cfbd.Configuration()
configuration.api_key['Authorization'] = 'YOUR_ACCESS_KEY_HERE'
configuration.api_key_prefix['Authorization'] = 'Bearer'

# 定义球员搜索接口
@app.route('/api/search-player', methods=['GET'])
def search_player():
    # 获取前端传入的参数
    first_name = request.args.get('firstName')
    last_name = request.args.get('lastName')

    if not first_name or not last_name:
        return jsonify({'error': '请提供名字和姓氏'}), 400

    # 调用CFBD API
    try:
        api_instance = cfbd.PlayersApi(cfbd.ApiClient(configuration))
        response = api_instance.player_search(search_term=f"{first_name} {last_name}")
        # 将模型对象转为可序列化的字典
        player_list = [player.to_dict() for player in response]
        return jsonify(player_list)
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(port=3000, debug=True)

步骤2:修改前端HTML的请求逻辑

更新submitForm函数,请求本地Flask接口:

function submitForm() {
    var firstName = document.getElementById('firstNameInput').value;
    var lastName = document.getElementById('lastNameInput').value;

    if (!firstName || !lastName) {
        alert('请输入完整的名字和姓氏');
        return;
    }

    // 构造本地接口地址
    var apiEndpoint = `/api/search-player?firstName=${encodeURIComponent(firstName)}&lastName=${encodeURIComponent(lastName)}`;

    fetch(apiEndpoint)
        .then(response => {
            if (!response.ok) throw new Error(`请求失败:${response.status}`);
            return response.json();
        })
        .then(data => {
            const playerContainer = document.getElementById('playerData');
            playerContainer.innerHTML = '';

            if (Array.isArray(data) && data.length > 0) {
                data.forEach(player => {
                    const playerCard = document.createElement('div');
                    playerCard.style.border = '1px solid #ccc';
                    playerCard.style.padding = '15px';
                    playerCard.style.marginBottom = '10px';
                    playerCard.innerHTML = `
                        <h3>${player.first_name} ${player.last_name}</h3>
                        <p><strong>学校:</strong>${player.school}</p>
                        <p><strong>位置:</strong>${player.position || '未记录'}</p>
                        <p><strong>毕业年份:</strong>${player.year || '未记录'}</p>
                    `;
                    playerContainer.appendChild(playerCard);
                });
            } else if (data.error) {
                playerContainer.innerHTML = `<p>${data.error}</p>`;
            } else {
                playerContainer.innerHTML = '<p>未找到匹配的球员信息</p>';
            }
        })
        .catch(error => {
            console.error('错误:', error);
            document.getElementById('playerData').innerHTML = `<p>请求出错:${error.message}</p>`;
        });
}

步骤3:运行测试

  1. 安装依赖:pip install flask cfbd
  2. 启动Flask服务:python app.py
  3. 在浏览器访问http://localhost:3000(将HTML文件放在Flask的templates目录,或确保静态HTML与Flask服务同域)

关于404错误的说明

GET /favicon.ico HTTP/1.1" 404是浏览器自动请求网站图标导致的,无需特殊处理;若要消除该错误,可在项目根目录添加一个名为favicon.ico的图标文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:15:57