【问题标题】:Why ajax request treated as form submit?为什么将ajax请求视为表单提交?
【发布时间】:2016-08-28 04:35:15
【问题描述】:

虽然我使用 Ajax 发送请求,但来自服务器的响应有一个完整的 HTML 页面,而不是预期的简单 JOSN 对象。

我的发送代码:

<script>
        var form = new FormData();
        form.append("name", "dasdf");
        form.append("email", "admin@admin.com");
        form.append("mobile_number", "454545");
        form.append("pin", "1234");
        form.append("gender", "male");
        form.append("allow_users_see_me", "true");
        form.append("password", "123456");
        form.append("country_code", "QA");

        var settings = {
            "async": true,
            "crossDomain": true,
            "url": "http://localhost/register",
            "method": "POST",
            "headers": {
                "X-CSRF-Token": "2oVPtMysQ30esIv6X2LJYghonCAbR4Zt4Op20SEV",
                "cache-control": "no-cache",
                "postman-token": "b3c3ff77-a12f-7b60-4b53-16fcbcb97469"
            },
            "processData": false,
            "contentType": 'application/json; charset=utf-8',
            "data": form
        }

        $.ajax(settings).done(function (response) {
            console.log(response);
        });
    </script>

有什么想法吗?

编辑

public function register(RegisterRequest $request)
{
    Log::info('start');
}

编辑

我找到了laravel返回异常的地方,在render函数里面。

public function render($request, Exception $e)
    {
        if ($e instanceof HttpResponseException) {
            return $e->getResponse();
        } elseif ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        } elseif ($e instanceof AuthorizationException) {
            $e = new HttpException(403, $e->getMessage());
        } elseif ($e instanceof ValidationException && $e->getResponse()) {
            return $e->getResponse();
        }

        if ($this->isHttpException($e)) {
            return $this->toIlluminateResponse($this->renderHttpException($e), $e);
        } else {
            return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e);
        }
    }

而 laravel 返回 HttpException。

-更新-

这是我的路线

Route::get('test', 'loginController@test');

这是错误

<div class="alert alert-danger">
                    The name field is required.<br/>
                    The email field is required.<br/>
                    The mobile number field is required.<br/>
                    The pin field is required.<br/>
                    The gender field is required.<br/>
                    The password field is required.<br/>
            </div>

-编辑- 路线是:

Route::post('register', 'AuthController@register');

【问题讨论】:

  • 您发送请求的格式与响应的格式无关。您是否检查过响应本身?通常 HTML 而不是 JSON 响应表示服务器上出现 404 或 500 错误
  • 您能否发布提供响应的 PHP/控制器代码及其链接到的路由。我通过经验发现,当出现错误时,我会得到 HTML 来响应 ajax 调用。最好的办法是做一些更精细的调试,看看它会把你带到哪里。
  • 由于 Laravel 会在执行函数之前验证 $request 规则,所以上面的 Log 不会记录 'start'.. 我正在向您发送函数签名和未执行的 Log 命令跨度>
  • 你需要弄清楚到那时它没有得到哪个规则。尝试像这样通过 chrome 运行请求:在 windows 上打开 web 开发人员工具 f12/在 mac 上 Cmd + Opt + I,单击网络选项卡,运行产生错误的请求,单击显示在网络标签(你也应该看到错误状态代码)并点击预览 - 你看到了什么?
  • 刚刚意识到你说“而 laravel 返回 HttpException”。好吧,这就是您的起点,正如我之前所说的“您能否发布提供响应的 PHP/控制器代码及其链接到的路由。”那么路线在哪里呢?我猜那里可能出了点问题?

标签: jquery ajax laravel laravel-5.2


【解决方案1】:

在我们交换 cmets 之后,我假设您的 form 变量要么没有正确设置,要么 PHP 无法读取数据。在发送表单变量并查看为什么它没有被正确读取之前,可能值得调试它。理论上应该没问题,但我猜如果你收到The name field is required. 等,可能会出现一些你不打算的问题。

通常,如果我将所有字段都放在一个表单中并且我正在使用 jQuery,我会这样做:

var form = $("form").serialize(); // or pass the id or other selector

尝试console.log之后的变量,看看数据结构与您现在的方式有何不同。

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 2018-08-29
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多