2011-11-25 36 views
17

Đây là một URI tuyệt đối của máy chủ:Làm thế nào để "hợp nhất" hai URI trong Java?

URI base = new URI("http://localhost/root?a=1"); 

Đây là một URI tương đối:

URI rel = new URI("/child?b=5"); 

Bây giờ tôi đang cố gắng để áp dụng tương đối một đến tuyệt đối và nhận:

URI combined = base + rel; // somehow 
assert combined.equals(new URI("http://localhost/root/child?a=1&b=5")); 

Có thể thực hiện thao tác như vậy với JDK hoặc một số thư viện không?

+2

Tôi mong đợi kết quả là 'http: // localhost/child? B = 5', vì đường dẫn tương đối bắt đầu bằng dấu gạch chéo tương đối với máy chủ (và ngay cả khi dấu gạch chéo không có, bit "root" sẽ được thay thế cũng như chuỗi truy vấn). –

+0

@SimonRichter có ý nghĩa, tôi sẵn sàng xóa dấu gạch chéo, chỉ cần cho tôi biết cách hoàn thành việc hợp nhất :) – yegor256

+0

Điều gì sẽ xảy ra trong trường hợp xung đột tham số, ví dụ: 'root? a = 1' và' child? a = 5'? 'a = 1' hoặc' a = 5'? – home

Trả lời

17
URL mergedURL = new URL(new URL(baseUrl), relativeUrl); 

Để vượt qua trên các thông số cơ sở url url sáp nhập, bạn sẽ phải giải nén chúng bằng tay bằng cách gọi URL # getQuery và gắn nó vào URL mới

Cái gì đó như,

String finalUrl = mergedUrl.toString() + "&" + baseUrl.getQuery(); 

Sẽ mất một if() để quyết định xem '&' là bắt buộc để kết hợp chúng hay không tùy thuộc vào hình thức hợp nhấtUrl.

+2

Đó là những gì 'URI # resolve()' đang thực hiện (và không phù hợp với các yêu cầu của OP, xem thêm các bình luận về câu hỏi). Xin lưu ý rằng 'URI' có phương thức' toURL() '(và từ phía bên kia,' URL' có phương thức 'toURI()'). – BalusC

+0

Thực ra phương pháp này rất gần với những gì tôi đang tìm kiếm. Vấn đề duy nhất ở đây là các tham số truy vấn bị phá hủy trong thư mục gốc, và đầu ra là: 'http: // localhost/root/child? B = 5' – yegor256

+0

Thật sao? Trong trường hợp của tôi, nó cũng bỏ qua '/ root'. – BalusC

0

Xấu xí, nhưng tác phẩm, trong trường hợp này ít nhất:

URI combined = new URI("http://" + base.getHost() + base.getPath() + rel.getPath() + "?" + base.getQuery() + "&" + rel.getQuery()); 

Yêu cầu thực hiện các URL thứ hai so với lần đầu tiên, nơi đầu tiên có một chuỗi truy vấn, là một chút kỳ quặc. Và URL thứ hai bắt đầu bằng '/' có nghĩa là liên quan đến "/", không phải là "/ root" ... bạn có chắc chắn về URL kết quả không?

+6

dòng mã của bạn khó chịu –

+0

Thật vậy. Đó là lý do tại sao tôi phải đặt câu hỏi về yêu cầu. Loại convolution này thường là một dấu hiệu tôi đang cố gắng làm điều sai trái ... –

+1

Tôi đã cố gắng để đưa ra một cái gì đó tốt đẹp, nhưng nó dẫn đến ít nhất hai phụ thuộc JAR và ~ 6 dòng mã ... –

2

URI (và Tệp cũng) có một hàm tạo chấp nhận URI hiện có (hoặc Tệp).
Nó được làm cho tương URI của:
URL mergedURL = new URL(baseUrl, relativeUrl);
Để hợp nhất hai đường dẫn tập tin bạn có thể sử dụng:
File mergedFile = new File(directoryFile, fileOrDir);
Nếu bạn sử dụng mergedFile.getName() bạn sẽ có được tên tập tin nếu nó không phải là một thư mục.
URL này không thể thực hiện được.

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