Proyecto Android usando httpclient -> http.client (apache), método post / get

Estoy haciendo un método Get y Post para un proyecto de Android y necesito “traducir” HttpClient 3.x a HttpClient 4.x (usando por android). Mi problema es que no estoy seguro de lo que hice y no encuentro la “traducción” de algunos métodos …

Este es el HttpClient 3.x que he hecho y (->) la “traducción” HttpClient 4.x si lo he encontrado (solo las partes que me preguntan problemas):

HttpState state = new HttpState (); --> ? HttpMethod method = null; --> HttpUriRequest httpUri = null; method.abort(); --> httpUri.abort(); //httpUri is a HttpUriRequest method.releaseConnection(); --> conn.disconnect(); //conn is a HttpURLConnection state.clearCookies(); --> cookieStore.clear(); //cookieStore is a BasicCookieStore HttpClient client = new HttpClient(); --> DefaultHttpClient client = new DefaultHttpClient(); client.getHttpConnectionManager().getParams().setConnectionTimeout(SOCKET_TIMEOUT) --> HttpConnectionParams.setConnectionTimeout(param, SOCKET_TIMEOUT); client.setState(state); --> ? client.getParams().setCookiePolicy(CookiePolicy.RFC_2109); --> HttpClientParams.setCookiePolicy(param, CookiePolicy.RFC_2109); PostMethod post = (PostMethod) method; --> ? post.setRequestHeader(...,...); --> conn.setRequestProperty(...,...); post.setFollowRedirects(false); --> conn.setFollowRedirects(false); RequestEntity tmp = null; --> ? tmp = new StringRequestEntity(...,...,...); --> ? int statusCode = client.executeMethod(post); --> ? String ret = method.getResponsBodyAsString(); --> ? Header locationHeader = method.getResponseHeader(...); --> ? ret = getPage(...,...); --> ? 

No sé si eso es correcto. Esto ha causado problemas porque los paquetes no reciben un nombre similar, y algunos métodos también. Solo necesito documentación (no he encontrado) y poca ayuda.

Gracias de antemano por su ayuda. Miguel

Aquí están los 4 documentos de HttpClient , eso es lo que usa Android (4, no 3, desde 1.0-> 2.x). Los documentos son difíciles de encontrar (gracias a Apache;)) porque HttpClient ahora es parte de HttpComponents (y si solo buscas HttpClient normalmente terminarás en las cosas 3.x).

Además, si realiza cualquier cantidad de solicitudes, no desea crear el cliente una y otra vez. Más bien, como los tutoriales para la nota de HttpClient , crea el cliente una vez y mantenlo. Desde allí, use el ThreadSafeConnectionManager .

Utilizo una clase auxiliar, por ejemplo, algo así como HttpHelper (que sigue siendo un objective móvil; planeo mover esto a su propio proyecto utilitario Android en algún momento, y admitir datos binarios, aún no he llegado allí), para ayudar con esta. La clase auxiliar crea el cliente y tiene métodos de envoltura de conveniencia para get / post / etc. En cualquier lugar donde USE esta clase de una Actividad , debe crear una AsyncTask interna interna (para que no bloquee el Subproceso UI mientras realiza la solicitud), por ejemplo:

  private class GetBookDataTask extends AsyncTask { private ProgressDialog dialog = new ProgressDialog(BookScanResult.this); private String response; private HttpHelper httpHelper = new HttpHelper(); // can use UI thread here protected void onPreExecute() { dialog.setMessage("Retrieving HTTP data.."); dialog.show(); } // automatically done on worker thread (separate from UI thread) protected Void doInBackground(String... urls) { response = httpHelper.performGet(urls[0]); // use the response here if need be, parse XML or JSON, etc return null; } // can use UI thread here protected void onPostExecute(Void unused) { dialog.dismiss(); if (response != null) { // use the response back on the UI thread here outputTextView.setText(response); } } } 

La forma más fácil de responder mi pregunta es mostrarle la clase que hice:

 clase pública HTTPHelp {

     DefaultHttpClient httpClient = new DefaultHttpClient ();
     HttpContext localContext = new BasicHttpContext ();
     aborto booleano privado;
     private String ret;

     HttpResponse response = null;
     HttpPost httpPost = null;

     HTTPHelp público () {

     }

     public void clearCookies () {

         httpClient.getCookieStore (). clear ();

     }

     anulación de anulación pública () {

         tratar {
             if (httpClient! = null) {
                 System.out.println ("Abort.");
                 httpPost.abort ();
                 aborto = verdadero;
             }
         } catch (Exception e) {
             System.out.println ("HTTPHelp: Abort Exception:" + e);
         }
     }

     public String postPage (String url, String data, boolean returnAddr) {

         ret = null;

         httpClient.getParams (). setParameter (ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);

         httpPost = new HttpPost (url);
         respuesta = nulo;

         StringEntity tmp = null;        

         httpPost.setHeader ("User-Agent", "Mozilla / 5.0 (X11; U; Linux" +
             "i686; en-US; rv: 1.8.1.6) Gecko / 20061201 Firefox / 2.0.0.6 (Ubuntu-feisty)");
         httpPost.setHeader ("Aceptar", "text / html, application / xml," +
             "application / xhtml + xml, text / html; q = 0.9, text / plain; q = 0.8, image / png, * / *; q = 0.5");
         httpPost.setHeader ("Content-Type", "application / x-www-form-urlencoded");

         tratar {
             tmp = new StringEntity (datos, "UTF-8");
         } catch (UnsupportedEncodingException e) {
             System.out.println ("HTTPHelp: UnsupportedEncodingException:" + e);
         }

         httpPost.setEntity (tmp);

         tratar {
             respuesta = httpClient.execute (httpPost, localContext);
         } catch (ClientProtocolException e) {
             System.out.println ("HTTPHelp: ClientProtocolException:" + e);
         } catch (IOException e) {
             System.out.println ("HTTPHelp: IOException:" + e);
         } 
                 ret = response.getStatusLine (). toString ();

                 return ret;
                 }
 }

Utilicé este tutorial para hacer mi método de publicación y da ejemplos (Gracias Daniel).

Gracias por su ayuda.

Bueno, puedes encontrar documentación sobre esa versión de HTTPClient aquí ; es especialmente útil ir a través de los escenarios de ejemplo que presentan.

Desafortunadamente no conozco la versión 3 de HTTPClient así que no puedo dar equivalencias directas; Te sugiero que tomes lo que tratas de hacer y revises sus escenarios de ejemplo.

  package com.service.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; 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.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class WebServiceDemoActivity extends Activity { /** Called when the activity is first created. */ private static String SOAP_ACTION1 = "http://tempuri.org/GetSubscriptionReportNames";//"http://tempuri.org/FahrenheitToCelsius"; private static String NAMESPACE = "http://tempuri.org/"; private static String METHOD_NAME1 = "GetSubscriptionReportNames";//"FahrenheitToCelsius"; private static String URL = "http://icontrolusa.com:8040/iPhoneService.asmx?WSDL"; Button btnFar,btnCel,btnClear; EditText txtFar,txtCel; ArrayList headlist = new ArrayList(); ArrayList reportlist = new ArrayList(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnFar = (Button)findViewById(R.id.btnFar); btnCel = (Button)findViewById(R.id.btnCel); btnClear = (Button)findViewById(R.id.btnClear); txtFar = (EditText)findViewById(R.id.txtFar); txtCel = (EditText)findViewById(R.id.txtCel); btnFar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Initialize soap request + add parameters SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1); //Use this to add parameters request.addProperty("Fahrenheit",txtFar.getText().toString()); //Declare the version of the SOAP request SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); envelope.dotNet = true; try { HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); //this is the actual part that will call the webservice androidHttpTransport.call(SOAP_ACTION1, envelope); // Get the SoapResult from the envelope body. SoapObject result = (SoapObject)envelope.bodyIn; if(result != null) { //Get the first property and change the label text txtCel.setText(result.getProperty(0).toString()); Log.e("err ","output is :::: "+result.getProperty(0).toString()); parseSON(); } else { Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show(); } } catch (Exception e) { e.printStackTrace(); } } }); btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { txtCel.setText(""); txtFar.setText(""); } }); } private void parseSON() { headlist.clear(); reportlist.clear(); String text = txtCel.getText().toString() ;//sb.toString(); Log.i("######", "###### "+text); try{ JSONObject jobj = new JSONObject(text); JSONArray jarr = jobj.getJSONArray("Head"); for(int i=0;i