HttpClient学习记录

这篇博客主要记录一下工作中使用到的点滴技术,也会对最基础的内容作讲解,当然讲的东西不只是工作内的内容,希望对各位读者有帮助。


这里说一句话:如果想要优雅的使用HttpClient进行抓取,应该同时掌握较好的关于HTTP协议的内容。就我个人的学习路程来看,对HTTP协议的内容和理解越深刻具体,对HttpClient的使用与理解就越容易。


HttpClient基础学习(GET/POST)

关于官方性质的概念就不在这里介绍了,这里主要是以java语言为基础写的一些偏向于基础的教程。

首先是一个关于基本GET请求的代码介绍,读者可直接粘贴复制运行代码,当然需要下载jar包,或者和我一样使用maven进行项目的jar包管理。
HttpClient Maven

 <dependency>
     <groupId>org.apache.httpcomponents</groupId>
     <artifactId>httpclient</artifactId>
     <version>4.3.3</version>
 </dependency>

使用GET请求的代码。

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;

import java.io.IOException;

public class Test {
    public static void main(String[] args) {

        //确定一个url,此处是我博客的链接
        String url = "http://blog.csdn.net/mlong54";

        //创建一个HttpClient对象
        HttpClient httpClient = HttpClients.createDefault();

        //这种创建方式的好处是可以在httpClientBuilder中添加我们需要的各种信息,关于详细内容会在以后的博客中更新,
        //如果读者是第一次接触HttpClient,那么可以将信息配置到下面的请求中就像我做的那样
//        HttpClientBuilder httpClientBuilder = HttpClients.custom();
//        HttpClient httpClient = httpClientBuilder.build();

        //创建一个GET请求,并为它添加头信息(此处添加了USer-Agent,主要介绍一下头信息的添加方法)
        HttpGet httpGet = new HttpGet(url);
        httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");

        try {
            //使用HttpCLient发起GET请求,并获得返回的响应实体
            HttpResponse httpResponse = httpClient.execute(httpGet);
            //打印响应的状态行信息, 例:HTTP/1.1 200 OK(HTTP协议版本,HTTP状态码,HTTP状态码解释)
            System.out.println(httpResponse.getStatusLine());
            //获取响应的实体信息,以输入流(InputStream)的形式获取页面源码(个人认为实体就是页面源代码的对象)
            HttpEntity httpEntity = httpResponse.getEntity();
            //通过指定的编码格式,将流转换为String,编码格式可以直接指定也可以从页面提取
            String content = IOUtils.toString(httpEntity.getContent(), "utf-8");

            System.out.println(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

另外介绍一下POST请求的代码书写方式,关于POST请求,比GET请求要复杂一下但也那么难理解。另外,POST请求与GET请求最大的区别就在于POST请求需要携带参数,这里的参数包括但不限于用户名密码、页面编号、数据的条数、时间戳、起始/结束位置以及加密的数据等等,POST可以携带的参数的种类主要由网站的开发者决定,他们喜欢带啥参数就带啥参数。
这里的大部分代码与GET请求一样,所以不再做解释。

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

public class HttpPostTest {
    public static void main(String[] args) {
        //找不到网址,只能意思意思了
        String url = "localhost:8000";

        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        //这里是对POST请求添加参数的地方,参数以key-value的形式添加
        List<NameValuePair> list = new ArrayList<NameValuePair>();
        list.add(new BasicNameValuePair("name", "value"));
        list.add(new BasicNameValuePair("username", "admin"));
        list.add(new BasicNameValuePair("password", "admin"));

        try {
            //添加方式是转化为Entity
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list);
            httpPost.setEntity(entity);

            HttpResponse httpResponse = httpClient.execute(httpPost);

            HttpEntity httpEntity = httpResponse.getEntity();

            System.out.println(httpResponse.getStatusLine());

            String content = IOUtils.toString(httpEntity.getContent());

            System.out.println(content);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这里简单介绍了一下,基本的GETPOST请求的发送方式,也没有简化代码,如果读者需要copy使用代码的话,尽量结合自己的情况进行修改,如果有任何问题可以给我留评论或者私信。

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值