2011-03-14 16 views
5

Estoy tratando de ejecutar el siguiente enlace usando siguiente código:androide HTTPGet tema

class httpget{ 
HttpGet httpGet=null; 

public void linkexecute(){ 
String url="http://<server>/<path>/action=send&msg=new message"; 
httpGet= new HttpGet(url); // line 1 
.... 
} 

at line 1 it is giving error "Illegal arguement exception"  
java.lang.IllegalArgumentException: Illegal character in query at index 77: http://<server>/<path>/sms.json?action=send&msg=new message  
at java.net.URI.create(URI.java:970)  
at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)  
at com.sms.login.LoginService.sendSms(LoginService.java:143) 

Mientras que no hay error para la siguiente dirección URL que no tiene huecos en palabras de "msg ="

String url="http://<server>/<path>/action=send&msg=newmessage"; 

¿Cómo puedo resolver el problema de la brecha en las palabras en la URL?

+0

¿Puedes publicar tu URL completa? –

Respuesta

1

Creo que se debe utilizar en lugar de 20% del espacio

+0

Sí, reemplaza un String por "" a% 20. – sinni800

+0

Es bueno cuando solo tienes espacio en tu url, pero hay muchos otros personajes que dan IllegalCharacterException. –

15

Aquí, te doy una función que elimina todos los caracteres no válidos a partir de la URL. Pase su URL en esta función y obtendrá una nueva URL con cadenas codificadas.

public static String convertURL(String str) { 

    String url = null; 
    try{ 
    url = new String(str.trim().replace(" ", "%20").replace("&", "%26") 
      .replace(",", "%2c").replace("(", "%28").replace(")", "%29") 
      .replace("!", "%21").replace("=", "%3D").replace("<", "%3C") 
      .replace(">", "%3E").replace("#", "%23").replace("$", "%24") 
      .replace("'", "%27").replace("*", "%2A").replace("-", "%2D") 
      .replace(".", "%2E").replace("/", "%2F").replace(":", "%3A") 
      .replace(";", "%3B").replace("?", "%3F").replace("@", "%40") 
      .replace("[", "%5B").replace("\\", "%5C").replace("]", "%5D") 
      .replace("_", "%5F").replace("`", "%60").replace("{", "%7B") 
      .replace("|", "%7C").replace("}", "%7D")); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return url; 
} 
+0

hay métodos para esto ... – njzk2

+0

Por mi cuenta, esto crea alrededor de 30 objetos String ... burdo. –

12

Definitivamente, usted debe utilizar URLEncoder.encode(String, String)

1

El URLEncoder no funcionó para mí cuando yo estaba fijando las variables a mi servicio web, ya que estaba reemplazando todos los parámetros. Terminé usando

URI uri = new URI("http", "server", "/path", "action=send&msg=newmessage", null); 
String url = uri.toASCIIString(); 

y posteriormente analizar mis datos descargados usando HttpPost con el HttpClient ...

String xml = null; 
DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpPost httpPost = new HttpPost(url); 

HttpResponse httpResponse = httpClient.execute(httpPost); 
HttpEntity httpEntity = httpResponse.getEntity(); 
xml = EntityUtils.toString(httpEntity); 

Asumo que HTTPGet método funcionará de la misma manera.

5

Creo que el problema es con los parámetros de la URL. En lugar de codificar o reemplazar URL entera, simplemente codificar los parámetros de la siguiente manera:

Url: http://myHost.com/mail.do?address=New York [email protected]&time=12$3; 
right url:http://myHost.com/mail.do? + UrlEncode(address) + "&" + UrlEncode(time); 

Otro ejemplo es:

Map<String, String> params = new HashMap<String, String>(); 
params.put("email", URLEncoder.encode(loginStr)); 
params.put("pass", URLEncoder.encode(passwStr)); 
Model.doAuthUser(params, userCallback); 

Model.doAuthUser loks como siguiente:

String url = "http://myHost.com/mail.do"; 
if (params != null) { 
url += "?"; 
Boolean beginAddParams = true; 
for (Entry<String, String> entryParams : params.entrySet()) { 
if (!beginAddParams) { 
    url +="&"; 
    } else { 
    beginAddParams = false; 
    } 
    url += entryParams.getKey() + "=" + entryParams.getValue(); 
} 

Y el uso de la url donde quieras.