2009-05-17 9 views
7

Estoy haciendo un método Get y Post para un proyecto android y necesito "traducir" HttpClient 3.x a HttpClient 4.x (usando por Android). Mi problema es que no estoy seguro de lo que he hecho y no encuentro la "traducción" de algunos métodos ...Proyecto Android usando httpclient -> http.client (apache), método post/get

Este es el HttpClient 3.x que he hecho y (->) el HttpClient 4.x "traducción" si he encontrado (Solamente 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 se nombran de manera similar, y algunos métodos también. Solo necesito documentación (no he encontrado) y poca ayuda.

Gracias de antemano por su ayuda. Michaël

Respuesta

8

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

 
public class HTTPHelp{ 

    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpContext localContext = new BasicHttpContext(); 
    private boolean abort; 
    private String ret; 

    HttpResponse response = null; 
    HttpPost httpPost = null; 

    public HTTPHelp(){ 

    } 

    public void clearCookies() { 

     httpClient.getCookieStore().clear(); 

    } 

    public void abort() { 

     try { 
      if(httpClient!=null){ 
       System.out.println("Abort."); 
       httpPost.abort(); 
       abort = true; 
      } 
     } 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); 
     response = null; 

     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("Accept", "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"); 

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

     httpPost.setEntity(tmp); 

     try { 
      response = 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; 
       } 
} 

que utilizan this tutorial hacer mi método de correos y thoses examples (Gracias Daniel).

Gracias por su ayuda.

+0

El segundo enlace se movió a https://hc.apache.org/httpcomponents-client-ga/examples.html – Dale

+0

El primer enlace se movió a https://hc.apache.org/httpcomponents-client-ga/tutorial/html/ – Dale

3

Bueno, puede encontrar documentación sobre esa versión de HTTPClienthere; es especialmente útil pasar por el example scenarios que presentan.

Desafortunadamente no sé 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.

+0

Gracias, lo haré mira la documentación y espero encontrar la solución a mi problema. –

22

Aquí están los HttpClient 4 docs, que es lo que está usando 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. Por el contrario, como tutorials for HttpClient note, crea el cliente una vez y mantenlo. Desde allí use el ThreadSafeConnectionManager.

Uso una clase auxiliar, por ejemplo algo como HttpHelper (que sigue siendo un objetivo 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 esto. La clase auxiliar crea el cliente y tiene métodos de envoltura de conveniencia para get/post/etc. En cualquier lugar que utilizar esta clase de un Activity, se debe crear un interior interior AsyncTask (para que no bloquee el hilo de interfaz de usuario al hacer la petición), por ejemplo:

private class GetBookDataTask extends AsyncTask<String, Void, Void> { 
     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); 
     } 
     } 
    } 
+0

Incluso mejor que mi HttpHelper es el que utiliza el proyecto ZXing - http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/AndroidHttpClient .Java.Un poco más difícil de trabajar (aunque todavía bastante fácil) y más capaz. (Y lo noté DESPUÉS de que había estado usando el que escribí durante mucho tiempo, enfoque similar, aunque no idéntico, pero convergente, no copiado;).) –

+0

Los documentos del cliente HTTP se han movido - ahora en: http://hc.apache.org/httpcomponents-client-ga/index.html – ohhorob

+0

Tenga en cuenta que la mía es una respuesta bastante antigua aquí, y no he actualizado ese proyecto de ayuda en un tiempo (tengo la intención, simplemente no tengo llegado a eso). A partir del API nivel 8, Android tiene su propia ayuda: http://developer.android.com/reference/android/net/http/AndroidHttpClient.html –

1
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<String> headlist = new ArrayList<String>(); 
    ArrayList<String> reportlist = new ArrayList<String>(); 

    @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<jarr.length();i++){ 
        JSONObject e = jarr.getJSONObject(i); 
        JSONArray names = e.names(); 
        for(int j=0;j<names.length();j++){ 
         String tagname = names.getString(j); 
         if (tagname.equals("ReportID")) { 
          headlist.add(e.getString("ReportID")); 
         } 
         if (tagname.equals("ReportName")) { 
          reportlist.add(e.getString("ReportName")); 
         } 
        } 
       }  
      } catch(JSONException e){ 
       Log.e("retail_home", "Error parsing data "+e.toString()); 
      } 

      Log.d("length ", "head lenght "+headlist.size()); 
      Log.d("value is ", "frst "+headlist.get(0)); 
      Log.d("length ", "name lenght "+reportlist.size()); 
      Log.d("value is ", "secnd "+reportlist.get(0)); 

    } 
} 
+5

Es posible que desee limpiarlo un poco y anotar su código. –

+0

... ¡pero gracias por tomarse el tiempo de publicar su código! – Dale

Cuestiones relacionadas