httpclient帮我们主动实现接口自动化,同时防止爬虫哦
前言
说了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
擦行间一个抽象的HttpClients
即CloseableHttpClient
。我们通过其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可以做响应动作。这也是有些爬虫的惯用技巧。在不断的试图模拟用户的请求。从而达到计算机级别的试错。
针对这种行为。我们的网站还需要加入防爬策略
作者:本该努力的年龄千万别放弃
链接:https://juejin.cn/post/7024852610607743006