Pregunta

Estoy haciendo un Get y Post método para un proyecto android y necesito a "traducir" HttpClient 3.x a HttpClient 4.x (con android).Mi problema es que no estoy seguro de lo que he hecho y no me parece que la "traducción" de algunos de los métodos de...

Este es el HttpClient 3.x que he hecho y (-->) el HttpClient 4.x "traducción" si he hallado en él (Sólo las partes que me piden 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 son nombrados de manera similar, y algunos métodos también.Solo me falta la documentación (no he encontrado) y poco de ayuda.

¿Fue útil?

Solución 2

La manera más fácil de contestar mi pregunta es para mostrar la clase que he hecho :

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;
                }
}

He utilizado este tutorial para hacer mi método post y los ejemplos

Otros consejos

Estos son los HttpClient 4 docs , eso es lo que Android está utilizando (4, no 3, a partir de 1,0-> 2.x). Los documentos son difíciles de encontrar (gracias Apache;)) debido HttpClient es ahora parte de HttpComponents (y si lo que busca HttpClient que normalmente terminan en la materia 3.x).

Además, si lo hace cualquier número de solicitudes que no desea crear el cliente una y otra vez. Más bien, como la tutoriales para HttpClient en cuenta , crear el cliente una vez y mantenerlo alrededor. Desde allí use la ThreadSafeConnectionManager.

Yo uso una clase de ayuda, por ejemplo, algo así como HttpHelper (que sigue siendo un objetivo en movimiento - planeo mover esto a su propio proyecto util Android en algún momento, y apoyar a los datos binarios, no he llegado allí todavía ), para ayudar con esto. La clase de ayuda crea el cliente, y cuenta con métodos de contenedor de conveniencia para GET / POST / etc. En cualquier lugar que utilizar esta clase de una , se debe crear un interior AsyncTask (para que no bloquee el hilo de interfaz de usuario al hacer la solicitud), 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);
         }
      }
   }

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

Lamentablemente, yo no sé la versión 3 de HTTPClient así que no puedo dar equivalencias directas; Le sugiero que tome lo que estamos tratando de hacer y mirar a través de 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<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));

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top