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
- Convertir objeto complejo de Java en Json
- Creación de JSONObject de cadena en JAVA (org.json)
- ¿Cómo puedo enviar los encabezados de autenticación básica HTTP en Android?
- Clase de modelo para Jackson Parser para analizar propiedades en mayúsculas
- Generar listview desde JSON en android
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!
- Obtener un objeto JSON desde una respuesta HTTP
- NoMethodError en el objeto de ejecución estándar de Android
- Cómo enviar el objeto json al servidor usando volley en andorid
- Pojo analiza gson con nombres de java no válidos
- Qué es stringentity en android y su uso
- ¿Cómo comprobar si la respuesta del servidor es JSONAobject o JSONArray?
- Forzar a GSON a usar Constructor que contenga Setters o Setters en general, en lugar de Fields
- Retrofit 2 RxJava - Gson - Deserialización "Global", tipo respuesta de cambio
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:
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.
- Android – reproductor de música en la pantalla de notificación (pantalla superior desplegable)
- Acceso a LogCat desde Android a través de Python