2012-10-25 23 views
8

Gần đây tôi nhận ra rằng tôi cần sử dụng easyXDM thay vì số $.ajax của jQuery để thực hiện yêu cầu đăng tên miền chéo. Sau khi nhận được easyXDM thiết lập tôi thấy rằng các chức năng xếp hàng khá chặt chẽ:Làm cách nào để gửi một đối tượng/mảng javascript dưới dạng cặp khóa-giá trị thông qua một bài đăng AJAX với easyXDM?

jQuery:

$.ajax({ 
    url: "/ajax/", 
    method: "POST", 
    data: myData 
}); 

easyXDM:

xhr.request({ 
    url: "/ajax/", 
    method: "POST", 
    dataType: 'json', // I added this trying to fix the problem, didn't work 
    data: myData 
}); 

myData là thiết lập một cái gì đó như:

myData = {}; 
myData[1] = 'hello'; 
myData[2] = 'goodbye'; 
myData[3] = {}; 
myData[3][1] = 'sub1'; 
myData[3][2] = 'sub2'; 
myData[3][3] = 'sub3'; 

Khi tôi thực hiện yêu cầu với jQuery, nó xử lý các trường con đúng cách, nhưng không phải với easyXDM.

Sau đây là cách yêu cầu POST đi vào máy chủ với jQuery:

screenshot-with-shadow.png http://img37.imageshack.us/img37/4526/screenshotwithshadow.png

Và đây là cách nói với easyXDM:

screenshot-with-shadow.png http://img204.imageshack.us/img204/4526/screenshotwithshadow.png

Làm thế nào tôi có thể gửi một đối tượng javascript/mảng của các cặp khóa-giá trị thông qua một yêu cầu easyXDM/XHR như jQuery không?

+0

Từ tài liệu: "Nếu không đặt easyXDM sẽ cố gắng sử dụng đối tượng JSON gốc", vì vậy trừ khi bạn ghi đè bộ nối tiếp thì đối tượng của bạn sẽ xuất hiện như bạn mong đợi? Có lẽ loại ép buộc đang xảy ra ở đâu đó trong mã trước của bạn? – robC

+1

Có vẻ như đây có thể là vấn đề với easyXDM. Có vẻ như trong tệp cors/index.html, nó sẽ thử và tuần tự hóa dữ liệu mà không kiểm tra xem liệu nó đã là một chuỗi chưa và nó dường như không xử lý mã hóa JSON đa cấp ... https: // github. com/oyvindkinsey/easyXDM/issues/199 – cwd

+1

@robC - liên quan đến nhận xét đã bị xóa của bạn Tôi nghĩ rằng đây là vấn đề với easyXDM - hãy xem http://pastebin.com/0eusK2vr – cwd

Trả lời

4

Trong ánh sáng của những hạn chế của easyXDM thảo luận trong các ý kiến, cách duy nhất bạn có thể sử dụng nó sẽ được serialize dữ liệu của bạn bằng tay khi đi qua nó để .request tức

xhr.request({ 
    url: "/ajax/", 
    method: "POST", 
    data: {jsonData: JSON.stringify(myData)} 
}); 

Hoặc bạn có thể tạo riêng của bạn giải pháp postMessage nhưng bạn sẽ loại trừ IE7 trở xuống.

+0

Điều này trông giống như một giải pháp thông minh cho đến khi vấn đề đó được hy vọng giải quyết. Tôi sẽ cho nó nó một cơ hội. –

+0

thực sự rất thông minh! giải pháp dễ nhất, ít nhất là ngay bây giờ! cảm ơn! :) –

+0

@SteveBrown đừng quên bao gồm triển khai JSON cho IE7! https://github.com/douglascrockford/JSON-js – robC

2

Tôi nghĩ bạn đã nhầm lẫn về việc gửi yêu cầu tên miền chéo thông qua AJAX. Bạn thực sự có thể gửi một tên miền chéo yêu cầu thông qua AJAX bất kể API JavaScript. Tuy nhiên, để nhận miền phản hồi, phản hồi cần phải thuộc loại dữ liệu JSONP.

JSONP chỉ đơn giản là JSON với đệm, ví dụ:

JSON:

{ Key: "Hello", Value: "World" } 

JSONP:

callback({ Key: "Hello", Value: "World" }) 

Đó là một sự khác biệt tinh tế nhưng JSONP by-pass chính sách cùng nguồn gốc của trình duyệt và cho phép bạn sử dụng dữ liệu JSON được phục vụ bởi một máy chủ khác.

Để tiêu thụ dữ liệu JSON đến từ một máy chủ thông qua jQuery AJAX thử điều này:

$.ajax({ 
    url: "http://mydomain.com/Service.svc/GetJSONP?callback=callback", 
    dataType: "jsonp", 
    data: myData, 
    success: function(data) { 
     alert(data); 
    } 
}); 

Để làm việc này bạn phải chắc chắn rằng dịch vụ web của bạn đang trở lại kết quả như JSONP và không JSON.

+0

easyXDM sử dụng iframe ẩn với postMessage, không phải jsonp! – robC

+0

Tôi đang cố gắng sử dụng easyXDM vì các yêu cầu ajax của miền chéo jQuery không được hỗ trợ trong tất cả các trình duyệt. –

+0

@SteveBrown JSONP sẽ hoạt động trong tất cả các trình duyệt. Nhưng bạn không thể sử dụng POST nó phải là một yêu cầu GET. – robC

1

Như easyXDM không thể serialize đúng cách bạn cần phải serialize dữ liệu bằng tay:

JSON.stringify(myData) 

Kể từ khi yêu cầu bây giờ sẽ chứa một chuỗi json chứ không phải là đối tượng sau đó index.html không nên phân tích các thuộc tính để tạo ra cấu trúc json . Truy cập index.html đi kèm với easyXDM và tìm mã sau:

var pairs = []; 
for (var key in config.data) { 
    if (config.data.hasOwnProperty(key)) { 
     pairs.push(encodeURIComponent(key) + "=" + encodeURIComponent(config.data[key])); 
    } 
} 
data = pairs.join("&"); 

Không thực thi mã này trong trường hợp yêu cầu POST. Chỉ cần gán config.data cho dữ liệu:

data = config.data; 
Các vấn đề liên quan