2012-05-15 6 views
13

Sto inviando una chiamata a un gateway SMS utilizzando la loro API REST. Va tutto bene quando invio una semplice parola come "Ciao", ma se aggiungo uno spazio, mi sono messo nei guai. Questo perché l'URI non può contenere spazi.Come passare gli spazi in una chiamata REST utilizzando HttpGet in java

Qual è il modo corretto di fare ciò che devo fare?

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(); 
} 

risultante sul 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: Come suggerito da alexey28 Sto usando l'encoder, qui è quello che faccio ora:

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); 

ma i risultati in

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) 

Cosa sto facendo di sbagliato qui?

La richiesta, una volta codificata: l'esecuzione di richiesta https://www.example.com/SecureREST/SimpleSMSsend%3FPhoneNumber%3D123%26Message%3DHello%2C+how+are+you%3F

risposta

24

Prima di inviare l'uso URLEncoder per codificare i valori dei parametri URL:

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

Essa sostituirà tutti i simboli, spazi inclusi -> '+' con una corretta uno per URL

+1

In questo modo risulta un java.lang.IllegalStateException: l'host di destinazione non deve essere nullo o impostato in parametri. Quello che ho fatto è questo: String restUrl = URLEncoder.encode ("https://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=Hello, come stai?", "UTF-8"); HttpGet httpget = new HttpGet (restUrl); – dukable

+0

Ho aggiornato il mio post iniziale per riflettere il problema che sto avendo ora. – dukable

+11

@ user1385655 Codifica solo il messaggio. URLEncoder codificherà qualsiasi carattere che abbia un significato speciale in un URL come? e &, quindi codificare l'intero URL lo renderà non valido. Per esempio. 'HttpGet (" http://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message= "+ URLEncoder.encode (" ciao come stai? "," UTF-8 "))' – erikxiv

Problemi correlati