java android

java - Tutorial JSONParser de androidhive, NoSuchMethodError en DefaultHttpClient



(1)

Estoy siguiendo this tutorial y obtengo este error:

Caused by: java.lang.NoSuchMethodError: No virtual method execute(Lorg/apache/http/client/methods/HttpUriRequest;)Lorg/apache/http/client/methods/CloseableHttpResponse; in class Lorg/apache/http/impl/client/DefaultHttpClient; or its super classes (declaration of ''org.apache.http.impl.client.DefaultHttpClient'' appears in /system/framework/ext.jar) at info.androidhive.materialtabs.adpater.JSONParser.makeHttpRequest(JSONParser.java:52) at info.androidhive.materialtabs.UserFunctions.loginUser(UserFunctions.java:37) at info.androidhive.materialtabs.activity.MainActivity$Login.doInBackground(MainActivity.java:551) at info.androidhive.materialtabs.activity.MainActivity$Login.doInBackground(MainActivity.java:519)

Aquí está la clase JSONParser que estoy usando:

public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; // constructor public JSONParser() { } // function get json from url // by making HTTP POST or GET method public JSONObject makeHttpRequest(String url, String method, List<NameValuePair> params) { // Making HTTP request try { // check for request method if(method == "POST"){ // request method is POST // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(new UrlEncodedFormEntity(params)); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); }else if(method == "GET"){ // request method is GET DefaultHttpClient httpClient = new DefaultHttpClient(); String paramString = URLEncodedUtils.format(params, "utf-8"); url += "?" + paramString; HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "/n"); } is.close(); json = sb.toString(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } // try parse the string to a JSON object try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } // return JSON String return jObj; } }


DefaultHttpClient quedó en desuso en el nivel 22 de la API y se eliminó en el nivel 23 de la API.

La documentación incluso se eliminó de la documentación de Android, aquí está el enlace a la ubicación de la documentación anteriormente, y puede ver dónde se redirige a: http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpClient.html

Cita por si acaso los cambios de redireccionamiento:

La versión de Android 6.0 elimina la compatibilidad con el cliente Apache HTTP. Si su aplicación está utilizando este cliente y se dirige a Android 2.3 (API nivel 9) o superior, use la clase HttpURLConnection en su lugar. Esta API es más eficiente porque reduce el uso de la red a través de la compresión transparente y el almacenamiento en caché de respuestas, y minimiza el consumo de energía.

Creé una versión actualizada de la clase JSONParser que estás usando, aquí está:

import android.util.Log; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; public class JSONParser { String charset = "UTF-8"; HttpURLConnection conn; DataOutputStream wr; StringBuilder result; URL urlObj; JSONObject jObj = null; StringBuilder sbParams; String paramsString; public JSONObject makeHttpRequest(String url, String method, HashMap<String, String> params) { sbParams = new StringBuilder(); int i = 0; for (String key : params.keySet()) { try { if (i != 0){ sbParams.append("&"); } sbParams.append(key).append("=") .append(URLEncoder.encode(params.get(key), charset)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } i++; } if (method.equals("POST")) { // request method is POST try { urlObj = new URL(url); conn = (HttpURLConnection) urlObj.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Accept-Charset", charset); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.connect(); paramsString = sbParams.toString(); wr = new DataOutputStream(conn.getOutputStream()); wr.writeBytes(paramsString); wr.flush(); wr.close(); } catch (IOException e) { e.printStackTrace(); } } else if(method.equals("GET")){ // request method is GET if (sbParams.length() != 0) { url += "?" + sbParams.toString(); } try { urlObj = new URL(url); conn = (HttpURLConnection) urlObj.openConnection(); conn.setDoOutput(false); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept-Charset", charset); conn.setConnectTimeout(15000); conn.connect(); } catch (IOException e) { e.printStackTrace(); } } try { //Receive the response from the server InputStream in = new BufferedInputStream(conn.getInputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); result = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { result.append(line); } Log.d("JSON Parser", "result: " + result.toString()); } catch (IOException e) { e.printStackTrace(); } conn.disconnect(); // try parse the string to a JSON object try { jObj = new JSONObject(result.toString()); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } // return JSON Object return jObj; } }

Ejemplo de AsyncTask para publicación:

class PostAsync extends AsyncTask<String, String, JSONObject> { JSONParser jsonParser = new JSONParser(); private ProgressDialog pDialog; private static final String LOGIN_URL = "http://www.example.com/testPost.php"; private static final String TAG_SUCCESS = "success"; private static final String TAG_MESSAGE = "message"; @Override protected void onPreExecute() { pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Attempting login..."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } @Override protected JSONObject doInBackground(String... args) { try { HashMap<String, String> params = new HashMap<>(); params.put("name", args[0]); params.put("password", args[1]); Log.d("request", "starting"); JSONObject json = jsonParser.makeHttpRequest( LOGIN_URL, "POST", params); if (json != null) { Log.d("JSON result", json.toString()); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } protected void onPostExecute(JSONObject json) { int success = 0; String message = ""; if (pDialog != null && pDialog.isShowing()) { pDialog.dismiss(); } if (json != null) { Toast.makeText(MainActivity.this, json.toString(), Toast.LENGTH_LONG).show(); try { success = json.getInt(TAG_SUCCESS); message = json.getString(TAG_MESSAGE); } catch (JSONException e) { e.printStackTrace(); } } if (success == 1) { Log.d("Success!", message); }else{ Log.d("Failure", message); } } }

Ejemplo de AsyncTask para Get:

class GetAsync extends AsyncTask<String, String, JSONObject> { JSONParser jsonParser = new JSONParser(); private ProgressDialog pDialog; private static final String LOGIN_URL = "http://www.example.com/testGet.php"; private static final String TAG_SUCCESS = "success"; private static final String TAG_MESSAGE = "message"; @Override protected void onPreExecute() { pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Attempting login..."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } @Override protected JSONObject doInBackground(String... args) { try { HashMap<String, String> params = new HashMap<>(); params.put("name", args[0]); params.put("password", args[1]); Log.d("request", "starting"); JSONObject json = jsonParser.makeHttpRequest( LOGIN_URL, "GET", params); if (json != null) { Log.d("JSON result", json.toString()); return json; } } catch (Exception e) { e.printStackTrace(); } return null; } protected void onPostExecute(JSONObject json) { int success = 0; String message = ""; if (pDialog != null && pDialog.isShowing()) { pDialog.dismiss(); } if (json != null) { Toast.makeText(MainActivity.this, json.toString(), Toast.LENGTH_LONG).show(); try { success = json.getInt(TAG_SUCCESS); message = json.getString(TAG_MESSAGE); } catch (JSONException e) { e.printStackTrace(); } } if (success == 1) { Log.d("Success!", message); }else{ Log.d("Failure", message); } } }

Para obtener más detalles, aquí está mi publicación de blog sobre este código: http://danielnugent.blogspot.com/2015/06/updated-jsonparser-with.html