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

Laravel实现表单提交后展示API返回数据的方案咨询

解决方案:仅在表单提交后加载并展示API数据

问题的核心在于你当前的控制器不管有没有表单提交,都会直接执行两个API请求并把数据传给视图,所以页面一加载就会显示域名建议数据。我们可以通过条件判断API调用和视图条件渲染来解决这个问题。

第一步:修改控制器代码

我们需要在控制器里判断用户是否提交了表单(也就是请求中是否包含sld和tld参数),只有当表单提交后才执行API调用:

public function domaincheck(Request $request) {
    ini_set('max_execution_time', 300);
    
    // 初始化数据变量为null,避免视图报错
    $final_data = null;
    $final_data1 = null;

    // 仅当表单提交(存在非空的sld和tld参数)时,调用API获取数据
    if ($request->filled(['sld', 'tld'])) {
        // 域名可用性检查
        $sld = $request->input('sld');
        $tld = $request->input('tld');
        
        $response = file_get_contents(
            'https://resellertest.enom.com/interface.asp?command=check&sld='. urlencode($sld) .'&tld='. urlencode($tld) .'&uid=resellid&pw=resellpw&responsetype=xml'
        );
        $data = simplexml_load_string($response);
        $final_data = json_decode(json_encode($data), true);

        // 域名建议获取
        $response1 = file_get_contents(
            'http://resellertest.enom.com/interface.asp?command=GETNAMESUGGESTIONS&uid=resellid&pw=resellpw&SearchTerm='. urlencode($sld) .'&MaxResults=5&ResponseType=XML'
        );
        $data1 = simplexml_load_string($response1);
        $final_data1 = json_decode(json_encode($data1), true);
    }

    // 传递数据到视图(替换成你的实际视图名称)
    return view('your-view-name', compact('final_data', 'final_data1', 'final_data2'));
}

这里做了几个关键优化:

  • 使用$request->filled()替代简单的存在判断,确保参数不仅存在而且不为空
  • 给URL参数加上urlencode(),防止特殊字符导致API请求出错
  • 简化了json_encode再json_decode的写法,逻辑不变但更简洁

第二步:修改视图代码

在视图里,我们需要判断数据是否存在,只有当数据存在时才渲染对应的结果,避免页面初始加载时显示空数据或错误:

<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" value="{{ old('sld') }}">
                <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'] }}" {{ old('tld') == $value['tld'] ? 'selected' : '' }}>
                                {{ $value['tld'] }}
                            </option>
                        @endforeach
                    </select>
                </span>
                <span class="input-group-addon">
                    <button type="submit" class="btn btn-sm btn-success">Submit</button>
                </span>
            </div>
            
            <!-- 仅当域名可用性数据存在时显示 -->
            @if($final_data)
                <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>
            @endif

            <!-- 仅当域名建议数据存在时显示 -->
            @if($final_data1)
                {{ print_r($final_data1) }}
            @endif
        </div>
    </div>
</form>

这里的优化点:

  • 简化了原有的tld列表循环逻辑,代码更清晰易读
  • 给输入框和下拉框加上old()辅助函数,提交表单后保留用户输入,提升体验
  • 用@if($final_data)和@if($final_data1)做条件渲染,页面初始加载时不会显示任何结果

额外建议(可选但推荐)

  1. 替换file_get_contents为Laravel Http客户端:
    Laravel自带的Http客户端比file_get_contents更可靠,支持错误处理和请求配置,示例:

    use Illuminate\Support\Facades\Http;
    
    // 域名可用性请求
    $response = Http::get('https://resellertest.enom.com/interface.asp', [
        'command' => 'check',
        'sld' => $sld,
        'tld' => $tld,
        'uid' => env('ENOM_UID'),
        'pw' => env('ENOM_PW'),
        'responsetype' => 'xml',
    ]);
    $data = simplexml_load_string($response->body());
    
  2. 敏感信息配置到.env文件:
    不要把API的uid和pw硬编码到代码里,放到.env文件:

    ENOM_UID=resellid
    ENOM_PW=resellpw
    

    然后在控制器里用env('ENOM_UID')和env('ENOM_PW')获取,更安全且便于环境切换。

内容的提问来源于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 07:30:28