2012-05-15 22 views
13

Estoy enviando una llamada a una puerta de enlace SMS usando su API REST. Todo está bien cuando envío una palabra simple como "Hola", pero si agrego un espacio, me meto en problemas. Esto porque el URI no puede contener espacios.Cómo pasar espacios en una llamada REST usando HttpGet en java

¿Cuál es la forma correcta de hacer lo que debo hacer?

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

resultante en el 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 

Editar: Según lo sugerido por alexey28 estoy usando el codificador, esto es lo que hago ahora:

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

Pero son los resultados en

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) 

¿Qué estoy haciendo mal aquí?

La solicitud una vez codificado: Solicitud de ejecución de https://www.example.com/SecureREST/SimpleSMSsend%3FPhoneNumber%3D123%26Message%3DHello%2C+how+are+you%3F

Respuesta

24

Antes de enviar el uso URLEncoder para codificar los valores de parámetros de URL:

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

Se reemplazará todos sus símbolos incluidos los espacios -> '+' con una adecuada para URL

+1

Hacerlo da como resultado una excepción java.lang.IllegalStateException: el host de destino no debe ser nulo o establecerse en parámetros. Lo que hice fue esto: String restUrl = URLEncoder.encode ("https://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=Hello, ¿cómo estás?", "UTF-8"); HttpGet httpget = new HttpGet (restUrl); – dukable

+0

Actualicé mi publicación inicial para reflejar el problema que estoy teniendo ahora. – dukable

+11

@ user1385655 Solo codifica el mensaje. URLEncoder codificará cualquier carácter que tenga un significado especial en una URL como? y &, por lo que la codificación de la URL completa la invalidará. P.ej. 'HttpGet (" http://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message= "+ URLEncoder.encode (" Hola, ¿cómo estás? "," UTF-8 "))' – erikxiv

Cuestiones relacionadas