我有一个使用graphene-django实现的graphql服务器。我可以像这样使用jquery对其进行查询:
function allIngredients() { return 'query{allProducts{edges{node{name}}}}' } var query = allIngredients(); $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); $.post("/graphql", {query: query}, function(response) { console.log(response); })
但是,当我尝试使用Fetch进行此调用时,由于CORS问题,我得到403。我通过在调用之前添加ajaxSetup …解决了jQuery中的相同问题。
这是使用提取的调用:
fetch('/graphql', { method: "POST", headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ csrfmiddlewaretoken: '{{ csrf_token }}', query:`{allProducts{ edges{ node{ id name orderPrice sellPrice } } }`}) } ) .then(function(response) { if (response.status >= 400) { throw new Error("Bad response from server"); } return response.json(); })
我尝试以与jQuery示例中相似的方式将csrfmiddlewaretoken添加到主体,但没有运气。我尝试添加凭证:如文档所说的 “ include” ,再次没有运气。我尝试使用凭据:“ same- origin”,并以不同方式组合此选项,再次获得相同结果。网络对此异常安静,我在做什么错?
解决方案是在getCookie()方法中。
fetch("/graphql", { method: "POST", credentials: "same-origin", headers: { "X-CSRFToken": getCookie("csrftoken"), "Accept": "application/json", 'Content-Type': 'application/json' }, body:JSON.stringify(query) })
当然,该方法必须在同一页面上。取自Django Docs。
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; }