2010-03-28 19 views
12

Tôi đang cố gắng giải quyết hai URI, nhưng nó không đơn giản như tôi muốn.Java URI.resolve

URI a = new URI("http://www.foo.com"); 
URI b = new URI("bar.html"); 

Sự cố là a.resolve(b).toString() hiện là "http://www.foo.combar.html". Làm thế nào tôi có thể thoát khỏi điều đó?

+0

đầu ra bạn đang mong đợi là gì? –

+0

"http://www.foo.com/bar.html" sẽ ổn thôi. – Cpa

+0

Tại sao bạn sử dụng hai URI? Phải có một lý do nhưng nó không rõ ràng. –

Trả lời

23

Âm thanh như bạn có thể muốn sử dụng URL chứ không phải là URI (đó là tổng quát hơn và cần phải đối phó với một cú pháp ít nghiêm ngặt.)

URI a = new URI("http://www.foo.com"); 
URI b = new URI("bar.html"); 
URI c = a.resolve(b); 
c.toString()  -> "http://www.foo.combar.html" 
c.getAuthority() -> "www.foo.com" 
c.getPath()  -> "bar.html" 

toString URI của() không cư xử như bạn mong đợi , nhưng với tính chất chung của nó, nó có thể là nó nên được tha thứ.

Phương thức toURL() đáng buồn của URI không hoạt động như tôi mong muốn cung cấp cho bạn những gì bạn muốn.

URL u = c.toURL(); 
u.toString()  -> "http://www.foo.combar.html" 
u.getAuthority() -> "www.foo.combar.html" --- Oh dear :(

Vì vậy, tốt nhất chỉ để bắt đầu thẳng ra với một URL để có được những gì bạn muốn:

URL x = new URL("http://www.foo.com"); 
URL y = new URL(x, "bar.html"); 
y.toString() -> "http://www.foo.com/bar.html" 
+1

+1 để nhấn mạnh sự khác biệt giữa URI và URL – skaffman

2

Ok, xuất hiện từ deffinition URL scheme://domain:port/path?query_string#fragment_id cần có 3 dấu gạch chéo trước con đường (hai sau sơ đồ và một trực tiếp trước đường dẫn)
2 trường hợp có thể xảy ra:

    có 3 dấu gạch chéo trong URI của bạn => mọi điều là OK
    có ít hơn 3 dấu gạch chéo trong URI của bạn => bạn cần phải thêm dấu gạch chéo ở phần cuối của URI

có snappet tôi mã:

String url = "http://www.foo.com"; 
String endSlash=""; 
int indexOfSlash = 0; 
for(int i = 0;i<3;i++){ 
    int nextIndex = url.indexOf('/',indexOfSlash); 
    if(!(nextIndex>0)){ 
     if(i>1){ 
     endSlash="/"; 
     }else{ 
     throw new MalformedURLException("Bad given url format, mising :// after schema"); 
     } 
    }else{ 
     indexOfSlash = ++nextIndex; 
    } 
} 
URL rightUrl = new URL(url+endSlash); 
3

URI nên chứa tách cuối cùng ('/') cũng như để giải quyết theo cách bạn muốn:

URI a = new URI("http://www.foo.com/"); 
0

với URI bạn có thể sử dụng

URI a = new URI("http://www.foo.com/"); 
URI b = new URI("bar.html"); 
URI c = a.resolve(b); 

hoặc

URI a = new URI("http://www.foo.com"); 
URI b = new URI("/bar.html"); 
URI c = a.resolve(b);