获得$ request-> isXmlHttpRequest()始终为false

时间:2018-02-17 20:29:31

标签: javascript php ajax symfony

我想坚持一个实体并用ajax捕获一条消息(没有Jquery),但我遇到了boolean $ request-> isXmlHttpRequest()的麻烦。

这里的脚本:

var xhr = getXMLHttpRequest(); 

xhr.open("POST", "{{ path('deplacement') }}", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("coordonnee="+abs+"-"+ord+"&name="+personnage[0].getAttribute('id'));

xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
        var classPersonnage = personnage[0].getAttribute('class');
        var arrayClassPersonnage = classPersonnage.split(' ');
        var id = personnage[0].getAttribute('id');
        personnage[0].removeAttribute('class');
        var newClass= '';
        for (i=0; i < arrayClassPersonnage.length-1; i++){
            newClass= newClass+' '+arrayClassPersonnage[i];
        }
        document.getElementById(id).setAttribute('class', newClass);
        var resultat = JSON.parse(xhr.responseText);
        alert(resultat['message']);
    }

我的控制器php在这里

/**
 * @Route("/game/combat/test", name="deplacement")

 */
public function deplacementAction(Request $request){

    if($request->isXmlHttpRequest())
    {
        $response = new JsonResponse();         
        return $response->setData(array('message' => 'Ok.'));
    }
    else{
        $response = new JsonResponse();         
        return $response->setData(array('message' => 'false'));
    }
}

我总是'假'。我试着这样做:

$response = new JsonResponse();
return $response->setData(array('message' => 'Ok.'));

所以没有$ request-&gt; isXmlHttpRequest(),但我抓住了一个内部错误服务器500.请帮助我,我变得疯狂。

2 个答案:

答案 0 :(得分:0)

检查方法查看代码的方法总是有助于找到代码问题的解决方案。如果您检查reservation = Reserve.objects.get(pk=request.POST.get('reservation')) 方法,可以在其dockblock中看到如下内容:

  

如果您的JavaScript库设置了X-Requested-With HTTP标头

,则它可以正常工作

方法体是:

isXmlHttpRequest

然后你需要添加正确的标题(大多数JS框架/库默认添加它,例如见jQuery滚动到return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); 部分):

headers

答案 1 :(得分:0)

我尝试了一个更简单的例子并犯了同样的错误。我点击按钮,我想要消息。

这里是按钮和脚本:

<button onclick="affichage()">Appuyer</button>
<script>
    function affichage(){
        if (window.XMLHttpRequest)
        { 
            xhr = new XMLHttpRequest();
        } 
        else  if (window.ActiveXObject)
        {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }

        xhr.onreadystatechange  = function() 
        { 
           if(xhr.readyState  == 4)
           {
                 if(xhr.status  == 200) 
                 {
                    var resultat = JSON.parse(xhr.responseText);
                    alert(resultat['message']); 
                 }
                 else
                {
                    alert('Erreur');
                }
           }
        }; 

        xhr.open("POST", "{{ path('deplacement') }}", true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(null);



    }
</script>

此处带路径的文件(&#39; deplacement&#39;):

<?php

namespace GameBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;

class ResolutionController extends Controller
{
/**
 * @Route("/game/combat/test", name="deplacement")
 */
public function deplacementAction(Request $request){

    $request = $this->get('request');

    if($request->isXmlHttpRequest())
    {
        $response = new JsonResponse();

        return $response->setData(array('message' => 'Ok.'));


    }
    else{

        $response = new JsonResponse();

        return $response->setData(array('message' => $request->isXmlHttpRequest()));

    }
}

}

我得到了xhr.send(null)的错误:无法加载资源,服务器响应状态为500.

我只想得到这个来纠正真实的代码。