2015-06-04 19 views
9

Vì vậy, tôi đang viết một Plugin jquery sử dụng grunt, và trong plugin của tôi, tôi cũng cần phải gọi dịch vụ web.cách tốt nhất để sử dụng Url tương đối API trong một Plugin jquery

Tên miền url webservice sẽ luôn có cùng tên miền với vị trí của tệp .js mà người dùng cần thêm cho plugin của chúng tôi. Vì vậy, tức là tương đối

1) Bao gồm tập tin JS cho plugin

http://mydomain1/js/myfile.js

2) Trong URL API gọi JS của tôi

cần phải được

api_domain: "http://mydomain1/api/v1" 

Và tôi muốn các api miền liên quan đến miền của tệp JS gọi nó là tôi đã thử làm

api_domain: "/mydomain1/api/v1" 

Nhưng điều này sẽ chọn tên miền của trình duyệt.

Vì vậy, tôi đã tự hỏi những gì cách tốt nhất để đạt được điều này

1) Sử dụng .NET Handler để chèn tên miền ngay từ context.request.url

2) Trong Grunt Êđê dựng tạo cụ thể .js cho từng môi trường tôi sẽ triển khai có url đầy đủ trong các JS

3) Các tùy chọn khác?

+0

Tất cả các giải pháp phía khách hàng đều có một chút nguy hiểm/dễ vỡ. Tôi muốn giới thiệu các giải pháp phía máy chủ mà bạn đã đề xuất; hiển thị tệp javascript trên mỗi máy chủ ứng dụng và cho phép ứng dụng khách nhận được giá trị được mã hóa cứng. – Brian

Trả lời

3

Vâng, bạn có thể thực sự có kịch bản tìm thấy nguồn của chính nó bằng cách sử dụng jquery. Chỉ cần đảm bảo cung cấp cho tệp js một tên đủ duy nhất.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://rawgit.com/demux/4d4ce440d7c379305a9a/raw/findfilehosttest.js"></script>

Script Thực tế:

$(function(){ 
    var url = $("script[src$='findfilehosttest.js']").attr('src') 
    var matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i) 
    var domain = matches && matches[1] 
    alert(domain) 
}) 

Nhưng nói chung tôi nghĩ rằng nó là tốt nhất để giữ cho nó đơn giản. Vì vậy, cho phép người dùng đặt URL của máy chủ theo cách thủ công, như vậy:

<script> 
    var MY_API_URL = 'https://instance1.myapiserver.foo' 
</script> 
<script src="/whateverpath/myapiscript.js"></script> 

Điều này cũng sẽ cho phép họ lưu trữ tập lệnh trên máy chủ của riêng họ hoặc thậm chí là ủy quyền cho lý do họ có thể có.

1

Tệp JS của bạn có nằm trên cùng một tên miền với trang web không? Trong trường hợp đó, chỉ cần sử dụng window.location.host trong plugin của bạn để nhận "http://mydomain".

+0

Không, nó sẽ không được, chúng tôi sẽ lưu trữ các tập tin JS và nó có thể đi trên bất kỳ trang web của người dùng. – StevieB

+0

Nhưng tập lệnh của bạn sẽ được triển khai trên nhiều môi trường khác nhau?(Nếu nó không phải là trường hợp, bạn sẽ hardcode tên miền trong kịch bản, nhanh chóng và bẩn ...). –

0

Bạn đã cố thực hiện việc này trong tệp JS của mình?

var api_version = "v1"; 
var api_domain = (function() { 

var scripts = document.getElementsByTagName('script'); 
var script = scripts[scripts.length - 1]; 
var domain; 

if (script.getAttribute.length !== undefined) { 
    domain = script.src; 
} else { 
    domain = script.getAttribute('src', -1); 
} 

domain = domain.split('/'); 
domain.pop(); 
domain = domain.join('/'); 

var tmp = document.createElement('a'); 
tmp.href = domain; 

var port = tmp.port !== "80" ? ":" + tmp.port : ""; 

return tmp.protocol + '//' + tmp.hostname + port + '/api/' + api_version; 

}()); 

Bạn sẽ có trên api_domain giá trị yêu cầu của mình.

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