2013-04-15 37 views
34

Tôi đang cố gắng gửi một yêu cầu POST của Ajax bằng cách sử dụng Jquery nhưng tôi gặp phải 400 lỗi yêu cầu không hợp lệ.Nhận được 400 lỗi yêu cầu không hợp lệ trong Jquery Ajax POST

Đây là mã của tôi:

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: { 
    "subject:title":"Test Name", 
    "subject:description":"Creating test subject to check POST method API", 
    "sub:tags": ["facebook:work", "facebook:likes"], 
    "sampleSize" : 10, 
    "values": ["science", "machine-learning"] 
    }, 
    error: function(e) { 
    console.log(e); 
    } 
}); 

Nó nói: Không thể xây dựng nguồn từ yêu cầu. Tôi đang thiếu gì?

+0

kiểm tra sơ bộ: Trình duyệt của bạn được trỏ đến http: // localhost: 8080 /, phải không? –

+1

có thể không phải là nguyên nhân gây ra sự cố của bạn, nhưng có vẻ như ["facebook: work, facebook: likes"] nên ["facebook: work", "facebook: likes"] – smerny

+0

Bạn đang sử dụng Java và Jersey? –

Trả lời

75

Cuối cùng, tôi đã phạm sai lầm và lý do là tôi cần phải stringify dữ liệu JSON tôi đang gửi. Tôi phải thiết lập kiểu nội dung và kiểu dữ liệu trong đối tượng XHR. Vì vậy, phiên bản chính xác là ở đây:

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: JSON.stringify({ 
    "subject:title":"Test Name", 
    "subject:description":"Creating test subject to check POST method API", 
    "sub:tags": ["facebook:work", "facebook:likes"], 
    "sampleSize" : 10, 
    "values": ["science", "machine-learning"] 
    }), 
    error: function(e) { 
    console.log(e); 
    }, 
    dataType: "json", 
    contentType: "application/json" 
}); 

Có thể nó sẽ giúp người khác.

+4

Có thể đã tự lưu lại một giờ gỡ lỗi thất vọng nếu tôi tìm thấy điều này để bắt đầu. Cảm ơn;) – bugsduggan

+5

Như đã từng nói bởi Thomas Edison, "Bạn đã không thất bại, bạn đã học được N cách mà sẽ không làm việc" trong giờ đó Vì vậy, vui mừng rằng bạn không tìm thấy nó trước đó và cố gắng giải quyết vấn đề chính mình . – sachinjain024

+1

Điều này đã giúp tôi. Tại sao bước này là cần thiết? – JasonTS

0

Bạn cần phải xây dựng truy vấn từ "dữ liệu" đối tượng bằng cách sử dụng chức năng sau

function buildQuery(obj) { 
     var Result= ''; 
     if(typeof(obj)== 'object') { 
      jQuery.each(obj, function(key, value) { 
       Result+= (Result) ? '&' : ''; 
       if(typeof(value)== 'object' && value.length) { 
        for(var i=0; i<value.length; i++) { 
         Result+= [key+'[]', encodeURIComponent(value[i])].join('='); 
        } 
       } else { 
        Result+= [key, encodeURIComponent(value)].join('='); 
       } 
      }); 
     } 
     return Result; 
    } 

và sau đó tiến hành

var data= { 
"subject:title":"Test Name", 
"subject:description":"Creating test subject to check POST method API", 
"sub:tags": ["facebook:work, facebook:likes"], 
"sampleSize" : 10, 
"values": ["science", "machine-learning"] 
} 

$.ajax({ 
    type: 'POST', 
    url: "http://localhost:8080/project/server/rest/subjects", 
    data: buildQuery(data), 
    error: function(e) { 
    console.log(e); 
    } 
}); 
+0

bạn không "có", jQuery sẽ cố gắng làm điều đó cho bạn. Mặc dù, nếu bạn tự xây dựng nó, bạn có thể đảm bảo nó ở định dạng bạn muốn nó ở. –

+0

Tôi không nghĩ rằng tôi cần phải xây dựng Object bằng cách này. Jquery thực hiện việc nâng hạng nặng này cho tôi. Hơn nữa, bất cứ khi nào dữ liệu được gửi qua phương thức POST, nó luôn luôn được mã hóa nên chúng ta không cần sử dụng encodeURIComponent trên dữ liệu được gửi đi. – sachinjain024

2

Câu hỏi này hơi cũ ... nhưng chỉ trong trường hợp ai đó phải đối mặt với lỗi 400, nó cũng có thể xuất phát từ việc cần đăng csrfToken làm tham số cho yêu cầu đăng bài.

Bạn có để có được tên và giá trị từ nghề trong mẫu của bạn:

<script type="text/javascript"> 
    window.csrfTokenName = "{{ craft.config.csrfTokenName|e('js') }}"; 
    window.csrfTokenValue = "{{ craft.request.csrfToken|e('js') }}"; 
</script> 

và vượt qua chúng trong yêu cầu của bạn

data: window.csrfTokenName+"="+window.csrfTokenValue 
+0

Không ai đề cập đến Craft CMS ở đây? –

Các vấn đề liên quan