httpclient帮我们主动实现接口自动化,同时防止爬虫哦

484 阅读3分钟

前言

  • 说了IO之后还有跨IO的操作,IO我们是针对文件的,但是在如今的时代我们是数据的时代。下面我们来看看HTTP那些事

GET

  • 我们在浏览器中打开一个网页会获取到丰富的数据,其中很大一部分数据是来自于服务器。那么我们的浏览器是如何获取这些服务器数据的。首先我们在服务器上开发响应的HTTP响应接口待响应。然后再HTML等前端语言中去调用该接口。浏览器的职能就是执行我们这些HTML语言的脚本。

  • 还是apache下提供了一个HttpClients工具类,通过这个工具类我们能够完成常见的restful格式的请求。无非就是常见的新增、修改、删除、查询四种类型的数据请求。

public String httpGet(String url, Map<String, ?> headMap) {
    String responseContent = null;
    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        HttpGet httpGet = new HttpGet(url);
        setGetHead(httpGet, headMap);
        CloseableHttpResponse response1 = httpclient.execute(httpGet);
        try {
            System.out.println(response1.getStatusLine());
            HttpEntity entity = response1.getEntity();
            responseContent = getRespString(entity);
            EntityUtils.consume(entity);
        } finally {
            response1.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            httpclient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return responseContent;
}
  • 通过HttpClients擦行间一个抽象的HttpClientsCloseableHttpClient。我们通过其addHeader方法添加请求头信息。那么你肯定会问请求参数怎么设置。我们是GET请求,get请求的参数就在请求地址上。所以我们是以追加的方式追加在请求路径上的。

POST

  • 可以这么说将近70%的请求都是在做get查询数据请求。剩下的30%才是操作数据的。这里的操作数据也不全是post请求。不要忘了我们还有put和delete请求。这两种请求不是很常见,这里我们就不做介绍了。下面我们来着重看看post请求如何发送的。
public String httpPost(String url, Map<String, Object> paramsMap,
                       Map<String, String> headMap) {
    String responseContent = null;
    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        HttpPost httpPost = new HttpPost(url);
        setPostHead(httpPost, headMap);
        setPostParams(httpPost, paramsMap);
        CloseableHttpResponse response = httpclient.execute(httpPost);
        try {
            System.out.println(response.getStatusLine());
            HttpEntity entity = response.getEntity();
            responseContent = getRespString(entity);
            EntityUtils.consume(entity);
        } finally {
            response.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            httpclient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    System.out.println("responseContent = " + responseContent);
    return responseContent;
}
  • 通过代码对比我们不难发现,post和get请求基本上是一样的。只不过构造的请求对象不一样,处理对象不一样以外,还有就是设置参数的方式不一样。post请求这里我们需要特殊处理下
private void setPostParams(HttpPost httpPost, Map<String, Object> paramsMap)
        throws Exception {
    if (paramsMap != null && paramsMap.size() > 0) {
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        Set<String> keySet = paramsMap.keySet();
        for (String key : keySet) {
            if(paramsMap.get(key)==null){
                nvps.add(new BasicNameValuePair(key, ""));
            }else{
                nvps.add(new BasicNameValuePair(key, paramsMap.get(key).toString()));
            }
        }
        httpPost.setEntity(new UrlEncodedFormEntity(nvps,"UTF-8"));
    }
}
  • 通过构造UrlEncodedFormEntity对象添加到httpPost对象中,作为请求参数

总结

  • 基本上代码都会对应我们平时的行为动作。我们在浏览器查询数据,代码HttpGet可以做响应动作。这也是有些爬虫的惯用技巧。在不断的试图模拟用户的请求。从而达到计算机级别的试错。
  • 针对这种行为。我们的网站还需要加入防爬策略