2014-12-22 4 views
0

나머지 API에 데이터를 게시하려면 thisthis을 사용하고 있습니다. 하지만 나쁜 요청 (400 회)을받습니다.Django 나머지 api는 게시 요청에서 csrf 문제를 일으키는 javascript 클라이언트를 사용합니다.

내 코드

var dataTask = {}; 
var dataPeri = {}; 
var csrf; 
var that = this; 
var date = new Date(); 
var dateString; 
dateString = date.toJSON().slice(0, 10); 
dataPeri['date'] = dateString; 
dataPeri['customer'] = customerId; 
csrf = $('input[name="csrfmiddlewaretoken"]').val(); 
console.log('csrf:'+csrf); 
console.log(dataPeri); //The objects seems fine with date at the right format and customerId a number 
$.ajaxSetup({ 
    beforeSend: function(xhr, settings){ 
     if (!this.crossDomain){ 
      xhr.setRequestHeader("X-CSRFToken", csrf); 
     } 
    } 
}); 
$.ajax({ 
    dataType:'json', 
    type: 'post', 
    url: '/crm/api/periodontogramms/', 
    data:JSON.stringify(dataPeri), 
    success: function (data, textStatus, jqXHR){ 
     alert("New Periodontogramm saved successfully"); 
     console.log("Periodontogramma "+ data); 
     that.periodontogramms.push(data); 
    }, 
    error: function (jqXHR, textStatus, errorThrown){ 
     alert(errorThrown); 
    } 
}); 

내가 다른 메시지가 오류와 함께 제공하지 않기 때문에 오류가 무엇인지 얻을 수없는 부분입니다. 나는 JSON을 보내고있다. (JSON.stringify로). 다른 것을 보내야합니까? 문제가 발생한 dateString 일 수 있습니까? 내 browsable API에 뭔가를 게시하려면 다음 형식으로 날짜를 사용합니다 : YYY-MM-DD. 그것이 내가 date.toJSON.slice(0, 10)에서 얻는 것입니다. 그것은 CSRF 문제가 나는 금지 메시지를 받고되어서는 안 된 경우 (403)

답변

1

내가 JSON.stringify를 제거하고 그냥 일반 자바 스크립트를 보낸 후이 원래 @Apostolos

그것은 일

하여 질문에 대답했다 출동.

그러나 그 이유에 대해서는 설명이 없었습니다. 문제는 JSON 데이터 (JSON.stringify으로 인코딩 됨)를 문자열로 API에 보내고 있었지만 API가 양식 인코딩 데이터를 보내는 것처럼 느껴졌습니다.

$.ajax() call에서 몇 가지 매개 변수를 사용했지만 중요한 몇 가지 매개 변수가 누락되었습니다.

dataType 매개 변수는 보내려는 Accept 헤더를 기반으로 jQuery가 예상 할 데이터 유형을 알려줍니다. 대부분의 경우, 이것은 json이며, 기본적으로 jQuery는 응답 내용을 기반으로 지능적인 추측을 취합니다. 대개 맞지만 도움을주는 것은 아닙니다.

contentType 매개 변수는 jQuery에게 어떤 데이터 유형이 서버로 전송되는지 알려줍니다. 기본적으로 this는 application/x-www-form-urlencoded; charset=UTF-8이고 인데 JSON 데이터를 보낼 때는 application/json으로 설정해야합니다. 이것은 중요합니다. 그렇지 않으면 jQuery는 사용자가 지정한 JSON 문자열을 어떻게 처리할지 알 수 없으며 API는 조작 된 양식으로 인코딩 된 데이터를 어떻게 처리할지 모릅니다.

data 매개 변수는 jQuery에 서버에 보낼 데이터를 알려줍니다. contentType을 기본값으로 사용하면 양식 인코딩 된 문자열 또는 양식 인코딩해야하는 키 -> 값 쌍을 포함하는 사전을 사용할 수 있습니다. contentType을 재정의하면 jQuery는 여기서 보낸 데이터가 서버에 보내야하는 데이터, 즉 사용자의 경우 JSON 문자열과 일치해야한다고 예상합니다.


나는 이것이 당신이에 전송 된 요청에 문제가 있었다 당신을 말 했어야으로도, 응답의 본문을 읽기 위해 브라우저의 개발자 도구를 사용하는 것이 좋습니다 것입니다.