2011-09-09 46 views
8

Tôi đã cố gắng sử dụng java.net.URI để thao tác chuỗi truy vấn nhưng tôi đã không thực hiện được nhiệm vụ rất đơn giản như nhận chuỗi truy vấn từ một url và đặt nó vào một url khác.Làm thế nào để sử dụng java.net.URI

Bạn có biết làm thế nào để làm cho mã này dưới đây làm việc

URI sample = new URI("test?param1=x%3D1"); 
URI uri2 = new URI(
      "http", 
      "domain", 
      "/a-path", 
      sample.getRawQuery(), 
      sample.getFragment()); 

Gọi để uri2.toASCIIString() nên quay lại: http://domain/a-path?param1=x%3D1 nhưng nó sẽ trả về: http://domain/a-path?param1=x%253D1 (mã hóa kép)

nếu tôi sử dụng getQuery() thay vì getRawQuery() chuỗi truy vấn không được mã hóa ở tất cả và url trông giống như sau: http://domain/a-path?param1=x=1

Trả lời

1

Vấn đề là hàm tạo thứ hai sẽ mã hóa qu ery và mảnh bằng cách sử dụng mã hóa URL. Nhưng = là một ký tự URI hợp pháp, vì vậy nó sẽ không mã hóa cho bạn; và % không phải là ký tự URI hợp pháp, do đó, sẽ mã hóa ký tự đó. Điều đó hoàn toàn trái ngược với những gì bạn muốn, trong trường hợp này.

Vì vậy, bạn không thể sử dụng hàm tạo thứ hai. Sử dụng cái đầu tiên, bằng cách nối các phần của chuỗi lại với nhau.

+0

Giải thích tốt. Vì vậy, giao diện URI được thiết kế kém (tôi hầu như không thấy bất kỳ lý do nào cho hàm tạo thứ hai). Bạn có biết lớp URI nào tốt hơn không? Giống như thời gian joda thay thế lớp Ngày/Lịch? –

+0

Không, tôi không ... và 'URI' đã được tạo lại từ lớp' java.net.URL' cũ hơn, có vấn đề riêng. – Jesper

0

Bạn có thể kết thúc cuộc gọi đến getQuery() với cuộc gọi đến java.net.URLEncoder.encode(String) không?

URI sample = new URI("test?param1=x%3D1"); 
URI uri2 = new URI(
     "http", 
     "domain", 
     "/a-path", 
     URLEncoder.encode(sample.getQuery(), "UTF-8"), 
     sample.getFragment()); 
+0

Bạn đã kiểm tra? 'URLEncoder.encode (sample.getQuery())' là nhiều hơn hoặc ít hơn bằng 'sample.getRawQuery()' vì vậy bạn sẽ kết thúc với cùng một vấn đề mà tôi có –

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