2012-05-15 48 views
13

Tôi đang gửi một cuộc gọi đến một cổng SMS bằng cách sử dụng API REST của họ. Mọi thứ đều ổn khi tôi gửi một từ đơn giản như 'Xin chào', nhưng nếu tôi thêm một khoảng trống thì tôi gặp rắc rối. Điều này bởi vì URI không thể chứa dấu cách.Cách chuyển dấu cách trong một cuộc gọi REST bằng cách sử dụng HttpGet trong java

Cách thích hợp để làm những gì tôi cần làm là gì?

HttpClient httpclient = new DefaultHttpClient(); 
try { 
    HttpGet httpget = new HttpGet("http://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=hello how are you?"); 
httpget.addHeader(new BasicHeader("Accept", "application/json")); 

// Create a response handler 
ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
String responseBody = httpclient.execute(httpget, responseHandler); 
System.out.println("----------------------------------------"); 
System.out.println(responseBody); 
System.out.println("----------------------------------------"); 
} finally { 
httpclient.getConnectionManager().shutdown(); 
} 

Kết quả trên IllegalArgumentException:

Exception in thread "main" java.lang.IllegalArgumentException 
at java.net.URI.create(Unknown Source) 
at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:69) 
at main.main(main.java:36) 
Caused by: java.net.URISyntaxException: Illegal character in query at index 97: https://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=Hello, how are you? 
at java.net.URI$Parser.fail(Unknown Source) 
at java.net.URI$Parser.checkChars(Unknown Source) 
at java.net.URI$Parser.parseHierarchical(Unknown Source) 
at java.net.URI$Parser.parse(Unknown Source) 
at java.net.URI.<init>(Unknown Source) 
... 3 more 

Edit: Theo đề nghị của alexey28 Tôi đang sử dụng Encoder, đây là những gì tôi làm bây giờ:

String query = "?PhoneNumber=123&Message=Hello, how are you?"; 
String host = "https://www.example.com/SecureREST/SimpleSMSsend"; 
String encodedUrl = host + URLEncoder.encode(query,"utf-8"); 
HttpGet httpget = new HttpGet(encodedUrl); 

Nhưng là kết quả trong

Exception in thread "main" org.apache.http.client.HttpResponseException: **Bad Request** 
at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:67) 
at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:54) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:735) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:709) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:700) 
at main.main(main.java:47) 

Tôi đang làm gì sai ở đây?

Yêu cầu khi mã hóa: thực hiện theo yêu cầu https://www.example.com/SecureREST/SimpleSMSsend%3FPhoneNumber%3D123%26Message%3DHello%2C+how+are+you%3F

Trả lời

24

Trước khi gửi sử dụng URLEncoder để mã hóa các thông số URL giá trị:

String restUrl = URLEncoder.encode("You url parameter value", "UTF-8"); 

Nó sẽ thay thế tất cả những biểu tượng của bạn bao gồm cả dấu -> '+' với một thích hợp cho URL

+1

Làm như vậy dẫn đến một java.lang.IllegalStateException: Máy chủ đích không được rỗng hoặc được đặt trong tham số. Những gì tôi đã làm là: String restUrl = URLEncoder.encode ("https://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=Hello, bạn thế nào?", "UTF-8"); HttpGet httpget = new HttpGet (restUrl); – dukable

+0

Tôi đã cập nhật bài đăng đầu tiên của mình để phản ánh vấn đề tôi đang gặp phải. – dukable

+11

@ user1385655 Chỉ mã hóa tin nhắn. URLEncoder sẽ mã hóa bất kỳ ký tự nào có ý nghĩa đặc biệt trong một URL chẳng hạn như? và &, do đó, mã hóa toàn bộ URL sẽ làm cho URL không hợp lệ. Ví dụ. 'HttpGet (" http://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message= "+ URLEncoder.encode (" xin chào bạn thế nào? "," UTF-8 "))' – erikxiv

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