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

Laravel表单提交后API串行调用的解决方案咨询

解决方案:分步执行API调用并按需展示结果

你的问题核心有两个关键点:一是确保第二个API使用第一个API返回的sld值发起请求,二是实现先展示第一个API结果、再展示第二个结果的分步效果。下面分两种常见场景给出具体实现方案:

场景1:后台同步顺序调用,前端控制分步展示

如果希望后台一次性完成两个API的顺序调用,但前端先显示第一个结果,再通过用户操作或自动延迟加载第二个结果,可以这样修改:

步骤1:修正控制器代码(用第一个API返回的sld调用第二个API)

原代码中第二个API直接使用了用户提交的sld,现在调整为从第一个API的响应中提取目标sld:

public function domaincheck(Request $request) {
    ini_set('max_execution_time', 300);
    $user_sld = $request['sld'];
    $tld = $request['tld'];

    // 1. 调用第一个API,获取域名检查结果
    $response = file_get_contents('https://reseller.enom.com/interface.asp?command=check&sld='. $user_sld .'&tld='. $tld .'&uid=resellid&pw=resellpw&responsetype=xml');
    $data = simplexml_load_string($response);
    $configdata = json_encode($data);
    $final_data = json_decode($configdata, true);

    // 从第一个API响应中提取sld值(根据实际XML结构调整,这里假设从DomainName拆分)
    // 若API返回单独的<sld>标签,可直接用$final_data['sld']
    $api_sld = explode('.', $final_data['DomainName'])[0];

    // 2. 使用提取到的sld调用第二个API
    $response1 = file_get_contents('http://reseller.enom.com/interface.asp?command=GETNAMESUGGESTIONS&uid=resellid&pw=resellpw&SearchTerm='. $api_sld .'&MaxResults=50&ResponseType=XML');
    $data1 = simplexml_load_string($response1);
    $configdata1 = json_encode($data1);
    $final_data1 = json_decode($configdata1, true);

    // 传递结果到视图
    return view('你的视图名称', compact('final_data', 'final_data1', 'final_data2'));
}

步骤2:修改视图,实现分步展示

通过JavaScript控制第二个结果的显示时机,支持自动延迟或用户点击触发:

<form class="form-horizontal" method="get">
    <div class="form-group">
        <div class=" col-lg-2"></div>
        <div class="col-lg-8">
            <div class="input-group m-b">
                <span class="input-group-addon" style="padding-left:10px; background-color: #999;" class='unclickable'>www</span>
                <input type="text" name="sld" class="form-control">
                <span class="input-group-addon">
                    <select class="form-control" name="tld" style="width: 100px;">
                        @foreach($final_data2['tldlist']['tld'] as $value)
                            <option value="{{ $value['tld'] }}">{{ $value['tld'] }}</option>
                        @endforeach
                    </select>
                </span>
                <span class="input-group-addon">
                    <button type="submit" class="btn btn-sm btn-success" >Submit</button>
                </span>
            </div>
            <!-- 第一个API结果:直接展示 -->
            <p class="text-center text-dark customFont" >
                @foreach($final_data as $key=>$value)
                    @if($key=='DomainName')
                        <b>{{$value}}</b> <b>-</b>
                    @endif
                    @if($key=='RRPText')
                        <b>{{$value}}</b>
                    @endif
                @endforeach
            </p>
            <!-- 第二个API结果:默认隐藏 -->
            <div id="suggestions-box" style="display: none;">
                <h5>域名建议</h5>
                @foreach($final_data1['DomainSuggestions']['Domain'] as $value)
                    {{$value}}<br>
                @endforeach
            </div>
            <button id="load-suggestions" class="btn btn-primary mt-2" type="button">加载域名建议</button>
        </div>
    </div>
</form>

<script>
// 方案A:用户点击按钮后显示第二个结果
document.getElementById('load-suggestions').addEventListener('click', function() {
    document.getElementById('suggestions-box').style.display = 'block';
    this.style.display = 'none';
});

// 方案B:页面加载3秒后自动显示(注释掉方案A即可启用)
// setTimeout(() => {
//     document.getElementById('suggestions-box').style.display = 'block';
//     document.getElementById('load-suggestions').style.display = 'none';
// }, 3000);
</script>

场景2:前端AJAX分步调用API(更流畅的用户体验)

如果希望完全分步处理:表单提交后先调用第一个API并展示结果,再基于第一个API返回的sld调用第二个API,可将后台拆分为两个独立接口:

步骤1:拆分控制器为两个方法

// 方法1:处理域名检查(第一个API)
public function checkDomain(Request $request) {
    ini_set('max_execution_time', 300);
    $user_sld = $request['sld'];
    $tld = $request['tld'];

    $response = file_get_contents('https://reseller.enom.com/interface.asp?command=check&sld='. $user_sld .'&tld='. $tld .'&uid=resellid&pw=resellpw&responsetype=xml');
    $data = simplexml_load_string($response);
    $configdata = json_encode($data);
    $final_data = json_decode($configdata, true);

    // 提取API返回的sld
    $api_sld = explode('.', $final_data['DomainName'])[0];
    
    return response()->json([
        'domain_info' => $final_data,
        'api_sld' => $api_sld
    ]);
}

// 方法2:获取域名建议(第二个API)
public function getSuggestions(Request $request) {
    ini_set('max_execution_time', 300);
    $api_sld = $request['sld'];

    $response1 = file_get_contents('http://reseller.enom.com/interface.asp?command=GETNAMESUGGESTIONS&uid=resellid&pw=resellpw&SearchTerm='. $api_sld .'&MaxResults=50&ResponseType=XML');
    $data1 = simplexml_load_string($response1);
    $configdata1 = json_encode($data1);
    $final_data1 = json_decode($configdata1, true);

    return response()->json($final_data1);
}

步骤2:配置路由

Route::get('/domain/check', [YourController::class, 'checkDomain'])->name('domain.check');
Route::get('/domain/suggestions', [YourController::class, 'getSuggestions'])->name('domain.suggestions');

步骤3:修改视图为AJAX提交

<form class="form-horizontal" id="domain-form">
    <div class="form-group">
        <div class=" col-lg-2"></div>
        <div class="col-lg-8">
            <div class="input-group m-b">
                <span class="input-group-addon" style="padding-left:10px; background-color: #999;" class='unclickable'>www</span>
                <input type="text" name="sld" class="form-control" required>
                <span class="input-group-addon">
                    <select class="form-control" name="tld" style="width: 100px;" required>
                        @foreach($final_data2['tldlist']['tld'] as $value)
                            <option value="{{ $value['tld'] }}">{{ $value['tld'] }}</option>
                        @endforeach
                    </select>
                </span>
                <span class="input-group-addon">
                    <button type="submit" class="btn btn-sm btn-success" >Submit</button>
                </span>
            </div>
            <!-- 第一个API结果容器 -->
            <div id="domain-result" class="text-center text-dark customFont" style="display: none;"></div>
            <!-- 第二个API结果容器 -->
            <div id="suggestions-container" style="display: none;">
                <h5>域名建议</h5>
                <div id="suggestions-list"></div>
            </div>
            <button id="load-suggestions" class="btn btn-primary mt-2" type="button" style="display: none;">加载域名建议</button>
        </div>
    </div>
</form>

<script>
document.getElementById('domain-form').addEventListener('submit', function(e) {
    e.preventDefault();
    const formData = new FormData(this);
    const sld = formData.get('sld');
    const tld = formData.get('tld');

    // 调用第一个API:域名检查
    fetch(`{{ route('domain.check') }}?sld=${encodeURIComponent(sld)}&tld=${encodeURIComponent(tld)}`)
        .then(res => res.json())
        .then(data => {
            // 展示第一个API结果
            const resultBox = document.getElementById('domain-result');
            resultBox.innerHTML = `<b>${data.domain_info.DomainName}</b> <b>-</b> <b>${data.domain_info.RRPText}</b>`;
            resultBox.style.display = 'block';

            // 保存API返回的sld
            window.apiSld = data.api_sld;
            // 显示加载按钮
            document.getElementById('load-suggestions').style.display = 'block';
        })
        .catch(err => {
            console.error('域名检查失败:', err);
            alert('域名检查失败,请重试');
        });
});

// 点击按钮调用第二个API
document.getElementById('load-suggestions').addEventListener('click', function() {
    this.disabled = true;
    this.textContent = '加载中...';

    fetch(`{{ route('domain.suggestions') }}?sld=${encodeURIComponent(window.apiSld)}`)
        .then(res => res.json())
        .then(data => {
            const listBox = document.getElementById('suggestions-list');
            listBox.innerHTML = '';
            data.DomainSuggestions.Domain.forEach(domain => {
                const div = document.createElement('div');
                div.textContent = domain;
                listBox.appendChild(div);
            });
            document.getElementById('suggestions-container').style.display = 'block';
            this.style.display = 'none';
        })
        .catch(err => {
            console.error('获取建议失败:', err);
            alert('获取建议失败,请重试');
            this.disabled = false;
            this.textContent = '加载域名建议';
        });
});
</script>

额外优化建议

  • 错误处理:建议给file_get_contents添加try-catch块,或替换为Laravel推荐的GuzzleHttp客户端(支持更完善的错误捕获和超时配置)。
  • API结构适配:如果第一个API返回的XML中有单独的sld字段,直接使用$final_data['sld']即可,无需从DomainName拆分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:32:53