Kaedah permintaan HTTP Android: HttpClient


Pengenalan kepada bahagian ini:

Dalam bahagian sebelumnya kita telah mempelajari tentang HttpURLConnection, bahagian ini pergi ke kaedah kedua: HttpClient, walaupun ia digunakan oleh Google Dihentikan, tetapi kami juga boleh menggunakan HttpClient untuk menangkap pakej, dan menggunakan Jsoup untuk menghuraikan halaman web untuk hasil yang lebih baik! HttpClient Digunakan untuk menerima/menghantar permintaan/tindak balas Http, tetapi tidak menyimpan cache jawapan pelayan, tidak melaksanakan kod JS yang dibenamkan dalam halaman HTML dan tidak mengubah suai kandungan halaman. Lakukan sebarang analisis dan pemprosesan! Mari mulakan dengan bahagian ini!


1.HttpClient proses penggunaan

Proses asas:

1.jpg


2. Contoh penggunaan HttpClient

1) Gunakan HttpClient untuk menghantar permintaan GET

Terus tampal kod untuk menghantar permintaan Get yang mudah:

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

}

Selain itu, jika ia mempunyai parameter Untuk permintaan GET, kita boleh meletakkan parameter ke dalam koleksi Senarai dan kemudian mengekod URL parameter. Akhir sekali, sambungkan sahaja dengan 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) Gunakan HttpClient untuk menghantar permintaan POST

Permintaan POST adalah lebih rumit sedikit daripada GET Selepas mencipta HttpPost objek, lulus koleksi NameValuePair untuk menyimpan penyerahan yang belum selesai parameter, dan hantar parameter kepada UrlEncodedFormEntity, dan akhirnya panggil setEntity(entiti) untuk melengkapkan, HttpClient.execute(HttpPost) sudah memadai; Saya tidak akan menulis contoh di sini Tulis Servlet anda sendiri, Jadi, siarkan sahaja kod teras~

Kod teras:

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

contoh penangkapan data HttpClient (pentadbiran pendidikan system Data capture)

Sebenarnya, terdapat banyak contoh HttpClient Sebagai contoh, penulis pernah menggunakannya untuk menangkap jadual waktu kurikulum pelajar pada sistem pentadbiran akademik sekolah: Ini melibatkan kuki, perkara yang mensimulasikan log masuk dan apabila ia datang untuk menangkap data (perangkak), kami biasanya menggunakan JSoup untuk menghuraikannya. Jika anda telah menangkap data, anda boleh menyemak sendiri maklumat yang berkaitan jika anda berminat Berikut ialah kunci untuk mendapatkan bahagian halaman web apl Bishe pengarang. Kod! Anda boleh mengalaminya:

HttpClient boleh mendapatkan dan menetapkan kuki melalui kod berikut: HttpResponse loginResponse = new DefaultHttpClient().execute(getLogin);Dapatkan Kuki: cookie = loginResponse.getFirstHeader("Set-Cookie").getValue();Bawa Cookie apabila meminta: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. Gunakan HttpPut untuk menghantar permintaan Put

Kod sampel adalah seperti berikut:

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

Ringkasan bahagian ini:

Baiklah Ya, bahagian ini adalah mengenai kaedah permintaan kedua Android HTTP: HttpClient. Dari bahagian seterusnya, kita akan mempelajari tentang penghuraian XML dan Json Itu sahaja untuk bahagian ini~


.