Méthode de requête HTTP Android : HttpClient
Introduction à cette section :
Dans la section précédente, nous avons découvert HttpURLConnection, cette section passe à la deuxième méthode : HttpClient, bien qu'elle soit utilisée par Google Obsolète, mais nous pouvons également utiliser HttpClient pour capturer le package et utiliser Jsoup pour analyser les pages Web pour de meilleurs résultats ! Client HTTP Utilisé pour recevoir/envoyer des requêtes/réponses Http, mais ne met pas en cache les réponses du serveur, n'exécute pas le code JS intégré dans les pages HTML et ne modifie pas le contenu de la page. Effectuez n’importe quelle analyse et traitement ! Commençons par cette section !
1.Processus d'utilisation de HttpClient
Processus de base :
2. Exemple d'utilisation de HttpClient
1) Utilisez HttpClient pour envoyer une requête GET
Collez directement le code pour envoyer une simple requête Get :
public class MainActivity extends Activity implements OnClickListener { private Button btnGet; private WebView wView; public static final int SHOW_DATA = 0X123; private String detail = ""; private Handler handler = new Handler() { public void handleMessage(Message msg) { if(msg.what == SHOW_DATA) { wView.loadDataWithBaseURL("",detail, "text/html","UTF-8",""); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setView(); } private void initView() { btnGet = (Button) findViewById(R.id.btnGet); wView = (WebView) findViewById(R.id.wView); } private void setView() { btnGet.setOnClickListener(this); wView.getSettings().setDomStorageEnabled(true); } @Override public void onClick(View v) { if (v.getId() == R.id.btnGet) { GetByHttpClient(); } } private void GetByHttpClient() { new Thread() { public void run() { try { HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://www.w3cschool.cc/python/python-tutorial.html"); HttpResponse httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == 200) { HttpEntity entity = httpResponse.getEntity(); detail = EntityUtils.toString(entity, "utf-8"); handler.sendEmptyMessage(SHOW_DATA); } } catch (Exception e) { e.printStackTrace(); } }; }.start(); } }
De plus, s'il a paramètres Pour les requêtes GET, nous pouvons placer les paramètres dans une collection List, puis encoder les paramètres en URL. Enfin, associez-le simplement à l'URL :
List params = new LinkedList(); params.add(new BasicNameValuePair("user", "猪小弟")); params.add(new BasicNameValuePair("pawd", "123")); String param = URLEncodedUtils.format(params, "UTF-8"); HttpGet httpGet = new HttpGet("http://www.baidu.com"+"?"+param);
2) Utilisez HttpClient pour envoyer une requête POST
La requête POST est légèrement plus compliquée que GET Après avoir créé le HttpPost. objet, transmettez la collection NameValuePair pour stocker les soumissions en attente paramètres, et transmettez les paramètres à UrlEncodedFormEntity, et enfin appelez setEntity(entity) pour terminer, HttpClient.execute(HttpPost) suffit ; je n'écrirai pas d'exemple ici, je n'ai pas encore trouvé le site Web de Post et je ne veux pas le faire. Écrivez votre propre servlet, alors publiez simplement le code principal ~
Code principal:
private void PostByHttpClient(final String url) { new Thread() { public void run() { try{ HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); List params = new ArrayList(); params.add(new BasicNameValuePair("user", "猪大哥")); params.add(new BasicNameValuePair("pawd", "123")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params,"UTF-8"); httpPost.setEntity(entity); HttpResponse httpResponse = httpClient.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == 200) { HttpEntity entity2 = httpResponse.getEntity(); detail = EntityUtils.toString(entity2, "utf-8"); handler.sendEmptyMessage(SHOW_DATA); } }catch(Exception e){e.printStackTrace();} }; }.start(); }
3. système Capture de données)
En fait, il existe de nombreux exemples de HttpClient. Par exemple, l'auteur l'a utilisé une fois pour capturer les horaires des programmes des élèves sur le système d'administration académique de l'école : Cela implique des cookies, des éléments qui simulent la connexion, et lorsqu'il s'agit de capturer des données (crawlers), nous utilisons généralement JSoup pour les analyser. Si vous avez capturé les données, vous pouvez vérifier vous-même les informations pertinentes si vous êtes intéressé. Voici la clé pour obtenir la partie page Web de l'application Bishe de l'auteur. Code! Vous pouvez en faire l'expérience :
HttpClient peut obtenir et définir des cookies via le code suivant : HttpResponse loginResponse = new DefaultHttpClient().execute(getLogin);Get Cookie : cookie = loginResponse.getFirstHeader("Set-Cookie").getValue();Apportez un cookie lors de la demande:httpPost.setHeader("Cookie", cookie);
//获得链接,模拟登录的实现: public int getConnect(String user, String key) throws Exception { // 先发送get请求 获取cookie值和__ViewState值 HttpGet getLogin = new HttpGet(true_url); // 第一步:主要的HTML: String loginhtml = ""; HttpResponse loginResponse = new DefaultHttpClient().execute(getLogin); if (loginResponse.getStatusLine().getStatusCode() == 200) { HttpEntity entity = loginResponse.getEntity(); loginhtml = EntityUtils.toString(entity); // 获取响应的cookie值 cookie = loginResponse.getFirstHeader("Set-Cookie").getValue(); System.out.println("cookie= " + cookie); } // 第二步:模拟登录 // 发送Post请求,禁止重定向 HttpPost httpPost = new HttpPost(true_url); httpPost.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false); // 设置Post提交的头信息的参数 httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"); httpPost.setHeader("Referer", true_url); httpPost.setHeader("Cookie", cookie); // 设置请求数据 List params = new ArrayList(); params.add(new BasicNameValuePair("__VIEWSTATE", getViewState(loginhtml)));// __VIEWSTATE参数,如果变化可以动态抓取获取 params.add(new BasicNameValuePair("Button1", "")); params.add(new BasicNameValuePair("hidPdrs", "")); params.add(new BasicNameValuePair("hidsc", "")); params.add(new BasicNameValuePair("lbLanguage", "")); params.add(new BasicNameValuePair("RadioButtonList1", "%D1%A7%C9%FA")); params.add(new BasicNameValuePair("txtUserName", user)); params.add(new BasicNameValuePair("TextBox2", key)); params.add(new BasicNameValuePair("txtSecretCode", "")); // ( ╯□╰ )逗比正方,竟然不需要验证码 // 设置编码方式,响应请求,获取响应状态码: httpPost.setEntity(new UrlEncodedFormEntity(params, "gb2312")); HttpResponse response = new DefaultHttpClient().execute(httpPost); int Status = response.getStatusLine().getStatusCode(); if(Status == 200)return Status; System.out.println("Status= " + Status); // 重定向状态码为302 if (Status == 302 || Status == 301) { // 获取头部信息中Location的值 location = response.getFirstHeader("Location").getValue(); System.out.println(location); // 第三步:获取管理信息的主页面 // Get请求 HttpGet httpGet = new HttpGet(ip_url + location);// 带上location地址访问 httpGet.setHeader("Referer", true_url); httpGet.setHeader("Cookie", cookie); // 主页的html mainhtml = ""; HttpResponse httpResponseget = new DefaultHttpClient() .execute(httpGet); if (httpResponseget.getStatusLine().getStatusCode() == 200) { HttpEntity entity = httpResponseget.getEntity(); mainhtml = EntityUtils.toString(entity); } } return Status; }
4. Utilisez HttpPut pour envoyer une requête Put
L'exemple de code est le suivant :
public static int PutActCode(String actCode, String licPlate, Context mContext) { int resp = 0; String cookie = (String) SPUtils.get(mContext, "session", ""); HttpPut httpPut = new HttpPut(PUTACKCODE_URL); httpPut.setHeader("Cookie", cookie); try { List params = new ArrayList(); params.add(new BasicNameValuePair("activation_code", actCode)); params.add(new BasicNameValuePair("license_plate", licPlate)); httpPut.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); HttpResponse course_response = new DefaultHttpClient().execute(httpPut); if (course_response.getStatusLine().getStatusCode() == 200) { HttpEntity entity2 = course_response.getEntity(); JSONObject jObject = new JSONObject(EntityUtils.toString(entity2)); resp = Integer.parseInt(jObject.getString("status_code")); return resp; } } catch (Exception e) { e.printStackTrace(); } return resp; }
Résumé de cette section :
D'accord Oui, cette section concerne la deuxième méthode de requête d'Android HTTP : HttpClient. Dans la section suivante, nous découvrirons l'analyse XML et Json. C'est tout pour cette section Merci~