2016-10-07 96 views
1

我试图使用Laravel 5来获得Ajax响应,但它只是不会工作。这是错误我在Chrome调试器看到:在Laravel 5中没有Ajax响应

POST http://localhost:8000/getmsg 500 (Internal Server Error)send @ jquery.min.js:4ajax @ jquery.min.js:4getMessage @ ajax:10onclick @ ajax:25 

这是message.php资源/浏览次数:

<html> 
    <head> 
     <title>Ajax Example</title> 

     <script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"> 
     </script> 

     <script> 
     function getMessage(){ 
      $.ajax({ 
       type:'POST', 
       url:'/getmsg', 
       data:'_token = <?php echo csrf_token() ?>', 
       success:function(data){ 
        $("#msg").html(data.msg); 
       } 
      }); 
     } 
     </script> 
    </head> 

    <body> 
     <div id = 'msg'>This message will be replaced using Ajax. 
     Click the button to replace the message.</div> 
     <?php 
     echo Form::button('Replace Message',['onClick'=>'getMessage()']); 
     ?> 
    </body> 

</html> 

这是我Ajaxcontroller.php:

<?php 
namespace App\Http\Controllers; 
use Illuminate\Http\Request; 
use App\Http\Requests; 
use App\Http\Controllers\Controller; 

class AjaxController extends Controller { 
    public function index(){ 
     $msg = "This is a simple message."; 
     return response()->json(array('msg'=> $msg), 200); 


} 
} 

然后我在路由中加入了web.php:

Route::get('ajax',function(){ 
    return view('message'); 
}); 
Route::post('/getmsg','[email protected]'); 
+0

尝试在JS添加此:$ .ajaxPrefilter(功能(选项,originalOptions,XHR){VAR 记号= $( '元[NAME = “csrf_token”]')ATTR( '内容'); 如果。 (令牌)返回xhr.setRequestHeader('X-XSRF-TOKEN',令牌); } });并尝试使用命名路线。编辑:这实际上不起作用,因为你没有在元中添加令牌。尝试使用主视图,在其中添加对所有页面都通用的所有内容,然后对其进行扩展。 Laracast有一些很棒的教程 – Indra

回答

1

可以适用于所有电话设置CSRF令牌一次:

<script> 
    const xCsrfToken = "{{ csrf_token() }}"; 
    $.ajaxSetup({ 
     headers: { 
      'X-CSRF-TOKEN': xCsrfToken 
     } 
    }); 
</script> 

而且你可以返回数组在您的行动,将全自动转换成JSON:在Ajax调用

​​
1

更改URL在这个Ajax代码,以正确的路径(例如//公共/的getMsg)

<script> 
     function getMessage(){ 
      $.ajax({ 
       type:'POST', 
       url:'/<project_name/public/getmsg', 
       data:'_token = <?php echo csrf_token() ?>', 
       success:function(data){ 
        $("#msg").html(data.msg); 
       } 
      }); 
     } 
     </script> 
0

变化如果你的htttp://hostname/getmsg

网址
<script> 
     function getMessage(){ 
      $.ajax({ 
       type:'POST', 
       url:'<?php echo url('/') ?>/getmsg', 
       data:'_token = <?php echo csrf_token() ?>', 
       success:function(data){ 
        $("#msg").html(data.msg); 
       } 
      }); 
     } 
     </script> 
0

我做到了通过设置AJAX类型为GET:

<script> 
     function getMessage(){ 
      $.ajax({ 
       type:'GET', 
       url:'/getmsg', 
       data:'_token = <?php echo csrf_token() ?>', 
       success:function(data){ 


$("#msg").html(data.msg); 

      } 
     }); 
    } 
</script> 

,并设置为获得的,而不是职位的路线:

Route::get('/getmsg','[email protected]'); 

这工作,但我绝对不知道为什么POST方法根本没有。我认为适当的解决方案是知道为什么POST不起作用,所以请即使这也起作用,如果有人知道如何用POST做到这一点,只要告诉。

+1

你有没有试过我给过的答案? – Ronald

+0

@Ronald Yep。完全相同的问题。 – prgrm

+1

你可以设置你的路线只是'getmsg'?并按照我给出的答案 – Ronald