- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
- 说了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可以做响应动作。这也是有些爬虫的惯用技巧。在不断的试图模拟用户的请求。从而达到计算机级别的试错。
- 针对这种行为。我们的网站还需要加入防爬策略