2012-11-23 25 views
5

Tôi đã có đối tượng URL có đường dẫn chứa unwise characters (RFC 2396) trong trường hợp của tôi là "|" (ống) nhân vật. Bây giờ tôi cần phải chuyển đổi một cách an toàn thành URI, nhưng URL.toURI() sẽ ném một ngoại lệ.Làm thế nào để chuyển đổi URL toURI khi có các ký tự không chính xác?

Tôi đã đọc URL documentation nhưng phần này là dành cho tôi bối rối:

Lớp URL không tự mã hóa hoặc giải mã bất kỳ thành phần URL theo cơ chế thoát được định nghĩa trong RFC2396. Đó là trách nhiệm của người gọi để mã hóa bất kỳ trường nào, cần phải được thoát trước khi URL gọi và cũng có thể giải mã mọi trường đã thoát, được trả về từ URL. Hơn nữa, vì URL không có kiến ​​thức về thoát URL, nó không nhận ra sự tương đương giữa mã hoá hoặc được giải mã của cùng một URL.

Vậy tôi nên làm như thế nào? Mô hình ở đây để mã hóa các ký tự này trong quá trình chuyển đổi là gì? Tôi có cần tạo bản sao được mã hóa của đối tượng URL của mình không?

Trả lời

2

OK, tôi đưa ra một cái gì đó như thế này:

URI uri = new URI(url.getProtocol(), 
        null /*userInfo*/, 
        url.getHost(), 
        url.getPort(), 
        (url.getPath()==null)?null:URLDecoder.decode(url.getPath(), "UTF-8"), 
        (url.getQuery()==null)?null:URLDecoder.decode(url.getQuery(), "UTF-8"), 
        null /*fragment*/); 

Hình như nó hoạt động, here is an example. Có thể một số xác nhận rằng đây là giải pháp thích hợp?

Chỉnh sửa: initial solution có một số vấn đề khi có truy vấn nên tôi đã sửa nó.

+0

Phương pháp này làm thay đổi URL như nó url mã hóa phần của URL, xem giải pháp của tôi –

+0

có bạn là đúng, Tôi đã nhận thấy rằng một số thời gian cái tôi, trong ideone.com (xem liên kết đầu tiên) Tôi đã sửa chữa giải pháp của tôi và tôi đã thêm các trường hợp thử nghiệm thêm mà tiết lộ vấn đề này. Tôi sẽ kiểm tra giải pháp của bạn, có vẻ tốt hơn. –

+0

Bằng cách các lỗi bạn gửi trên jmeter đã được cố định ngày hôm qua, bạn có thể thử hàng đêm xây dựng –

1

Sử dụng mã hóa URL?

Từ ví dụ của bạn, bạn đang có:

URL url = new URL("http", "google.com", 8080, "/crapy|path with-unwise_characters.jpg"); 

Thay vào đó, tôi sẽ sử dụng:

String path = "/crapy|path with-unwise_characters.jpg" 
URL url = new URL("http", "google.com", 8080, URLEncoder.encode(path, "UTF-8")); 

này nên làm việc và xử lý tất cả các nhân vật khôn ngoan trong đường dẫn theo mã hóa URL chuẩn.

+0

đây là giải pháp OK, nhưng mục tiêu chính của tôi là chuyển đổi sang URI để giải pháp của tôi trực tiếp hơn, đặc biệt là tôi không tạo URL đến từ mã của bên thứ ba. –

1

HttpClient 4 có một đối tượng cho org.apache.http.client.utils.URIBuilder rằng:

  URIBuilder builder = 
      new URIBuilder() 
     .setScheme(url.getProtocol()) 
     .setHost(url.getHost()) 
     .setPort(url.getPort()) 
     .setUserInfo(url.getUserInfo()) 
     .setPath(url.getPath()) 
     .setQuery(url.getQuery()); 
    URI uri = builder.build(); 
    return uri; 
Các vấn đề liên quan