Error con datos JSON Android Argumento Ilegal HttpClient

Tengo problemas con la transferencia de JSON en Android. Recibo el error siguiente en LogCat .

 04-29 04:47:11.362: E/Trace(851): error opening trace file: No such file or directory (2) 04-29 04:47:12.243: I/System.out(851): 1 04-29 04:47:12.243: I/System.out(851): 2 04-29 04:47:12.303: W/System.err(851): java.lang.IllegalArgumentException: Illegal character in query at index 42: http://SOME_WEBSITE/api/api.php?package= {"key":"SOME_KEY","info":{"type":"user","login":{"password":"some_password","email":"test@gmail. com"}},"request":"info"} 04-29 04:47:12.313: W/System.err(851): at java.net.URI.create(URI.java:727) 04-29 04:47:12.333: W/System.err(851): at org.apache.http.client.methods.HttpGet.<init>(HttpGet. java:75) 04-29 04:47:12.333: W/System.err(851): at com.example.jsontest.MainActivity.onCreate(MainActivity. java:47) 04-29 04:47:12.333: W/System.err(851): at android.app.Activity.performCreate(Activity.java:5104) 04-29 04:47:12.333: W/System.err(851): at android.app.Instrumentation.callActivityOnCreate( Instrumentation.java:1080) 04-29 04:47:12.333: W/System.err(851): at android.app.ActivityThread.performLaunchActivity( ActivityThread.java:2144) 04-29 04:47:12.343: W/System.err(851): at android.app.ActivityThread.handleLaunchActivity( ActivityThread.java:2230) 04-29 04:47:12.343: W/System.err(851): at android.app.ActivityThread.access$600(ActivityThread. java:141) 04-29 04:47:12.343: W/System.err(851): at android.app.ActivityThread$H.handleMessage(ActivityThread. java:1234) 04-29 04:47:12.343: W/System.err(851): at android.os.Handler.dispatchMessage(Handler.java:99) 04-29 04:47:12.343: W/System.err(851): at android.os.Looper.loop(Looper.java:137) 04-29 04:47:12.343: W/System.err(851): at android.app.ActivityThread.main(ActivityThread.java:5041) 04-29 04:47:12.343: W/System.err(851): at java.lang.reflect.Method.invokeNative(Native Method) 04-29 04:47:12.402: W/System.err(851): at java.lang.reflect.Method.invoke(Method.java:511) 04-29 04:47:12.402: W/System.err(851): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run( ZygoteInit.java:793) 04-29 04:47:12.402: W/System.err(851): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04-29 04:47:12.402: W/System.err(851): at dalvik.system.NativeStart.main(Native Method) 04-29 04:47:12.402: I/System.out(851): Something is wrong 

Este es el código de Android que estoy intentando ejecutar

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView the_text_view = (TextView) findViewById(R.id.name); //Construct the JSON JSONObject json = new JSONObject(); JSONObject info_json = new JSONObject(); JSONObject login_info = new JSONObject(); try { login_info.put("email", "[email protected]"); login_info.put("password", "some_password"); info_json.put("type", "user"); info_json.put("login", login_info); json.put("key", "SOME_KEY"); json.put("request", "info"); json.put("info", info_json); HttpClient httpClient = new DefaultHttpClient(); System.out.println("1"); String requestLink = "http://SOME_WEBSITE/api/api.php?package="+json.toString(); System.out.println("2"); HttpGet httpGet = new HttpGet(requestLink); System.out.println("3"); HttpResponse httpResponseGet = httpClient.execute(httpGet); System.out.println("4"); HttpEntity resEntityGet = httpResponseGet.getEntity(); System.out.println("5"); if (resEntityGet != null) { String response = EntityUtils.toString(resEntityGet); JSONObject json_response = new JSONObject(response); System.out.println(json.toString()); } System.out.println("Looks alright"); } catch (Exception e) { e.printStackTrace(); System.out.println("Something is wrong"); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

Tiene que ser algo con la llamada GET . No estoy seguro de qué es exactamente, pero toda mi impresión de System.out hasta esa parte del programa …

¡Gracias de antemano por cualquier ayuda!

Primero Usted está pasando una cadena de consulta que tiene espacios en ella, que romperá la url. Por lo tanto, es necesario realizar una encode antes de enviar:

 String requestLink = "http://SOME_WEBSITE/api/api.php?package="+Encoder.encode(json.toString(),"UTF-8"); 

Segundo

Está intentando realizar la operación de red en UI Thread, que no se permitirá en Android 3.0 y lanzará NetworkOnMainThreadException . Utilice AsyncTask o un subproceso independiente para realizar la operación de red.

Tratar :

 String requestLink = "http://SOME_WEBSITE/api/api.php?package="+json.toString(); String finalRequestString = URLEncoder.encode(requestLink,"UTF-8"); 
 java.lang.IllegalArgumentException: Illegal character in query 

Hay como un personaje en su solicitud de obtener que no es legal en una URL. Debe codificar las cadenas de URL antes de pasarlas en una solicitud GET. Para más detalles, véase:

https://en.wikipedia.org/wiki/Percent-encoding

Espero que esto te ayude . En esta clase se codifica el método. También puede pasar los parámetros requeridos.

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URLEncoder; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.json.JSONException; import org.json.JSONObject; public class JsonClient { public enum RequestMethod{ GET, POST } private ArrayList <NameValuePair> params; private ArrayList <NameValuePair> headers; private String url; private int responseCode; private String message; private JSONObject jsonResponse; public JSONObject getResponse() { return jsonResponse; } public String getErrorMessage() { return message; } public int getResponseCode() { return responseCode; } public JsonClient(String url) { this.url = url; params = new ArrayList<NameValuePair>(); headers = new ArrayList<NameValuePair>(); } public void addParam(String name, String value) { params.add(new BasicNameValuePair(name, value)); } public void addHeader(String name, String value) { headers.add(new BasicNameValuePair(name, value)); } public void execute(RequestMethod method) throws Exception { switch(method) { case GET: { //add parameters String combinedParams = ""; if(!params.isEmpty()){ combinedParams += "?"; for(NameValuePair p : params) { String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8"); if(combinedParams.length() > 1) { combinedParams += "&" + paramString; } else { combinedParams += paramString; } } } HttpGet request = new HttpGet(url + combinedParams); //add headers for(NameValuePair h : headers) { request.addHeader(h.getName(), h.getValue()); } executeRequest(request, url); break; } case POST: { HttpPost request = new HttpPost(url); //add headers for(NameValuePair h : headers) { request.addHeader(h.getName(), h.getValue()); } if(!params.isEmpty()){ request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); } executeRequest(request, url); break; } } } private void executeRequest(HttpUriRequest request, String url) { HttpClient client = new DefaultHttpClient(); HttpResponse httpResponse; try { httpResponse = client.execute(request); responseCode = httpResponse.getStatusLine().getStatusCode(); message = httpResponse.getStatusLine().getReasonPhrase(); HttpEntity entity = httpResponse.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); String response = convertStreamToString(instream); jsonResponse = new JSONObject(response); // Closing the input stream will trigger connection release instream.close(); } } catch (ClientProtocolException e) { client.getConnectionManager().shutdown(); e.printStackTrace(); } catch (IOException e) { client.getConnectionManager().shutdown(); e.printStackTrace(); }catch (JSONException e) { e.printStackTrace(); } } private static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } } 

Si desea utilizar el JSON como un 'GET' (es decir, como parte de la url), entonces tendrá que codificar la cadena. Por ejemplo, observe cuando ingresa un espacio en blanco en su navegador, lo convierte en un %20 . Esto es porque url no puede contener espacios en blanco.

Compruebe esta entrada para saber cómo codificar su url: Codificación de URL de Java de parámetros de cadena de consulta

La salida LogCat muestra algunos espacios en la cadena requestLink que está intentando utilizar para la solicitud GET. Aquí está el bit relevante de LogCat

 package= { 

¿Ves los espacios entre el signo de igualdad y la abrazadera de apertura?

Probablemente debería recortar el espacio vacío de la cadena JSON antes de concatenarla a la URL base. También debe considerar el uso del método de análisis de Uri para asegurar que todos los caracteres están codificados correctamente, http://developer.android.com/reference/android/net/Uri.html#parse(java.lang.String) .

Por último, ¿está seguro de que desea anexar una cadena JSON grande a la URL de base? Eso parece un poco extraño, pero si la API lo llama, el consejo anterior debería solucionar su problema.

  • No se puede leer los datos del paquete de notificación de inserción de Parse
  • La aplicación muestra error en el nuevo dispositivo (piruleta) pero funciona bien en mi dispositivo antiguo (kitkat)
  • Tipo de incompatibilidad de JSON o org.json.jsonecxeption
  • Jackson JSON Parser rendimiento
  • Solicitud de excepción de Android en IOException al recuperar JSON de URL
  • Android newline en mi EditText
  • ¿Cómo puedo obtener la respuesta JSON de una solicitud POST en un WebView?
  • Error de Stackoverflow de JsonObject Build
  • Android Java; ¿Cómo puedo analizar un archivo JSON local de carpeta de activos en un ListView
  • Obtener Elementos de JSON Array Android
  • Cómo enviar datos JSON ARRAY al servidor en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.