2009-05-17 6 views
7

Sto facendo un metodo Get e Post per un progetto Android e ho bisogno di "tradurre" HttpClient 3.x in HttpClient 4.x (usando da android). Il mio problema è che non sono sicuro di quello che ho fatto e non trovo la "traduzione" di alcuni metodi ...Progetto Android con httpclient -> http.client (apache), metodo post/get

Questo è il HttpClient 3.x che ho fatto e (->) la 4.x "traduzione" HttpClient se ho trovato (Solo le parti che mi chiedono problemi):

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(...,...); --> ? 

non so se questo è corretto. Ciò ha causato problemi perché i pacchetti non sono denominati in modo simile e anche alcuni metodi. Ho solo bisogno di documentazione (non ho trovato) e poco aiuto.

Grazie in anticipo per il vostro aiuto. Michaël

risposta

8

Il modo più semplice per rispondere alla mia domanda è quello di mostrare la classe che ho fatto:

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

ho usato this tutorial di fare il mio metodo post e thoses examples (Grazie Daniel).

Grazie per il vostro aiuto.

+0

Il secondo link si trasferisce a https://hc.apache.org/httpcomponents-client-ga/examples.html – Dale

+0

Il primo collegamento è trasferito a https://hc.apache.org/httpcomponents-client-ga/tutorial/html/ – Dale

3

Bene, è possibile trovare la documentazione su quella versione di HTTPClienthere; è particolarmente utile passare attraverso il example scenarios che presentano.

Io sfortunatamente non conosco la versione 3 di HTTPClient quindi non posso dare equivalenze dirette; Ti suggerisco di prendere ciò che stai cercando di fare e guardare attraverso i loro scenari di esempio.

+0

Grazie, lo farò guarda la documentazione e spero di trovare la soluzione del mio problema. –

22

Ecco lo HttpClient 4 docs, che è ciò che Android sta usando (4, non 3, a partire da 1.0-> 2.x). I documenti sono difficili da trovare (grazie Apache;)) perché HttpClient fa ora parte di HttpComponents (e se si cerca HttpClient normalmente si finirà con il file 3.x).

Inoltre, se si fa un qualsiasi numero di richieste non si vuole creare il cliente più e più volte. Piuttosto, come tutorials for HttpClient note, crea il client una volta e tienilo in giro. Da lì utilizzare il ThreadSafeConnectionManager.

Io uso una classe di supporto, ad esempio qualcosa come HttpHelper (che è ancora un obiettivo in movimento - ho intenzione di spostare questo al proprio progetto di utilizzo Android a un certo punto e supportare i dati binari, non sono ancora arrivati) , per aiutare con questo. La classe helper crea il client e ha metodi di wrapper convenienti per ottenere/pubblicare/ecc. Ovunque si utilizza questa classe da un Activity, è necessario creare un interno interno AsyncTask (in modo da non ostruire il thread dell'interfaccia utente, mentre effettua la richiesta), ad esempio:

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

Ancora meglio rispetto al mio HttpHelper è quella del progetto ZXing utilizza - http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/AndroidHttpClient .Giava.Un po 'più difficile da lavorare (anche se è ancora abbastanza facile) e più capace. (E l'ho notato DOPO che stavo usando quello che ho scritto per molto tempo, approccio simile, sebbene non identico, ma convergente, non copiato.;)) –

+0

I documenti del client HTTP si sono spostati - ora a: http://hc.apache.org/httpcomponents-client-ga/index.html – ohhorob

+0

Tieni presente che la mia è una risposta abbastanza vecchia qui, e non ho aggiornato quel progetto di supporto in un attimo (ho intenzione di, non ho ottenuto ad esso). A partire dal livello API 8, Android ha il proprio helper: 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

Puoi pulire un po 'e annotare il tuo codice. –

+0

... ma grazie per aver dedicato del tempo per pubblicare il tuo codice! – Dale