如何使用GET方法取得网页内容及POST请求的RFC2616解释
创建一个 GetMethod 的实例,这是一种连接方法的创建。在创建 GetMethod 实例时,将待连接的地址传入到它的构造函数中。

调用第一步创建好的实例的 execute 方法,以执行第二步创建好的 method 实例。
4. 读 response
5. 释放连接。无论执行方法是否成功,都必须释放连接
6. 对得到后的内容进行处理
以下是用 GET 方法来取得某网页内容的代码编写步骤:首先明确要使用 GET 方法;接着确定获取网页内容的目标;然后按照相关编程语法和规范来编写具体的代码语句以实现用 GET 方法取得该网页内容。
以下是程序的完整代码,并且可在附件中的 test.GetSample 里找到。
package test;
import java.io.IOException;
导入 org.apache.commons.httpclient 相关的类。 它包含了用于进行 HTTP 客户端操作的各种功能和类。 例如 HttpMethodBase 等类用于定义 HTTP 请求的方法和参数。 还有 HttpClient 类用于创建 HTTP 客户端实例并发送请求。 以及 HttpConnectionManager 类用于管理 HTTP 连接等。 这些类共同协作来实现 HTTP 客户端的功能。
使用 org.apache.commons.httpclient.methods 中的 GetMethod 类。
引入 org.apache.commons.httpclient.params.HttpMethodParams 类。
public class GetSample{
参数为 String 类型的数组 args。
//构造HttpClient的实例
创建了一个 HttpClient 实例,名为 httpClient 。
//创建GET方法的实例
创建了一个名为 getMethod 的 GetMethod 对象,其参数为 "http://www.ibm.com"。
//使用系统提供的默认的恢复策略
getMethod 获取其参数,然后设置参数为 HttpMethodParams.RETRY_HANDLER 。
创建了一个新的 DefaultHttpMethodRetryHandler 对象。
try {
//执行getMethod
使用 httpClient 执行 getMethod 方法,得到的状态码赋值给 statusCode 。
如果状态码不等于 HttpStatus.SC_OK ,那么
System.err 打印出:“方法失败:”
+ getMethod.getStatusLine());
}
//读取内容
获取到的方法获取到了响应体,这个响应体是一个字节数组,即 byte[] responseBody = getMethod.getResponseBody();
//处理内容
输出新的字符串(responseBody)。
} catch (HttpException e) {
//发生致命的异常,可能是协议不对或者返回的内容有问题
请检查你提供的 http 地址!
e.printStackTrace();
} catch (IOException e) {
//发生网络异常
e.printStackTrace();
} finally {
//释放连接
调用 getMethod 并释放连接。
}
}
}
下面这个是本人实用的demo
package com.bw.util;
import java.io.IOException;
import java.net.URI;
import java.util.Map;
引入了 org.apache.http.client.methods 包中的 CloseableHttpResponse 类。
使用了“import”关键字来导入特定的类,其中“org.apache.http.client.methods.HttpGet”是被导入的类。它用于执行 HTTP GET 请求相关的操作。
引入了 org.apache.http.client.utils 包中的 URIBuilder 类。
引入 org.apache.http.impl.client.CloseableHttpClient;
导入 org.apache.http.impl.client.HttpClientBuilder 这个类。
导入 org.apache.http.impl.client.HttpClients 这个类。
从“org.apache.http.util”这个包中导入“EntityUtils”。
/**
HttpClient 通过使用 Java 代码来模拟浏览器的行为,从而发出 HTTP 请求,并获取相应的响应结果。
*
*/
public class HttpClientUtil {
公共静态的 void 方法 main,其参数为 String 类型的数组 args。
String 这个变量名为 url ,它的值是 "http://127.0.0.1:9090/taotao_rest/rest/item/536563" 。
使用 doGet 方法获取数据,传入的参数为 url 和 null,获取到的结果赋值给 result 变量。
System.out.println(result);
}
//
该方法用于通过指定的 URL 获取数据,并可以携带参数(如果有)。它会发起一个 HTTP GET 请求,并返回服务器响应的内容。在实际使用中,需要根据具体的业务需求和环境来处理返回的结果。例如,可以将返回的内容解析为特定的数据格式,或者进行进一步的业务逻辑处理。 paramMap) {
CloseableHttpResponse 的 response 为 null 。
CloseableHttpClient 这个对象 httpClient 是 null 。
String result = null;
try {
//1.创建httpClient对象
HttpClient 被创建为默认的实例。
//2.创建uri
创建了一个 URIBuilder 对象 uriBuilder,该对象用于构建指定的 URL 地址 url。
如果 paramMap 不为空并且不是空的。
对于 paramMap 的键集里的每一个字符串 key 而言:
uriBuilder 会添加一个参数,参数名为 key,参数值为 paramMap 中对应的 key 的值。
}
}
URI uri = uriBuilder.build();
//3.创建HttpGet
创建了一个 HttpGet 对象 httpGet,该对象的参数是 uri
//4.发送http请求
使用 httpClient 执行了 httpGet ,并得到了 response 。
//5.获取响应结果
如果 response 不为空且 response 的状态行的状态码为 200 ,那么 ;如果 response 为空或者 response 的状态行的状态码不为 200 ,那么 。
获取到的响应的实体通过 EntityUtils 转换为字符串,使用的字符编码是 utf-8,转换后的结果赋值给 result 变量。
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
//6.关闭资源
if(response != null) {
response.close();
}
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
}
post 请求
根据 RFC2616,以下是对 POST 的解释:POST 方法的作用是向目的服务器发起请求,要求服务器接受附在请求后的实体,并将其视为请求队列(Request-Line)中请求 URI 所指定资源的附加新子项。POST 被设计成以统一的方法来实现以下功能:
HttpClient 中的 PostMethod 和 GetMethod 类似,不同之处在于设置 PostMethod 的实例与 GetMethod 不同,其余步骤大致相同。在下面的例子中,省略了与 GetMethod 相同的步骤,仅说明与上述不同的地方,且以登录清华大学 BBS 为例进行说明。
字符串 url 为 "http://www.newsmth.net/bbslogin2.php";该 url 具体指向 "http://www.newsmth.net/bbslogin2.php" 这个地址;"http://www.newsmth.net/bbslogin2.php" 被赋予给了字符串 url 。
创建了一个 PostMethod 对象 postMethod,该对象用于向指定的 url 发送 POST 请求。
// 填入各个表单域的值
NameValuePair 数组 data 包含一个元素,该元素为一个新的 NameValuePair 对象,其“id”字段值为“youUserName”。
创建一个新的 NameValuePair 对象,其键为 "passwd",值为 "yourPwd" 。
// 将表单的值放入postMethod中
postMethod 将数据设置为请求体。
// 执行postMethod
执行 `httpClient.executeMethod(postMethod)` 后,得到一个整型的状态码 `statusCode` 。
HttpClient 对于像 POST 和 PUT 这样要求接受后继服务的请求,不能自动进行转发处理。
// 301或者302
如果状态码等于 HttpStatus.SC_MOVED_PERMANENTLY 或者
如果 statusCode 等于 HttpStatus.SC_MOVED_TEMPORARILY ,那么
// 从头中取出转向的地址
获取的 postMethod 的响应头中的 "location" 对应的头部位置信息为 Header locationHeader 。
String location = null;
if (locationHeader != null) {
location 等于 locationHeader 获取到的值。
} else {
System.err 输出:位置字段值为 null 。
}
return;