# HttpClient入门－基本功能的使用（POST方法）

**URL:** <https://www.isharkfly.com/t/httpclient-post/7033>\
**Category:** 程序语言\
**Created:** [December 10, 2013, 7:34pm UTC](https://www.isharkfly.com/t/httpclient-post/7033 "2013-12-10T19:34:26Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [December 10, 2013, 7:34pm UTC](https://www.isharkfly.com/t/httpclient-post/7033/1 "2013-12-10T19:34:26Z")

</div>

POST方法

根据RFC2616，对POST的解释如下：POST方法用来向目的服务器发出请求，要求它接受被附在请求后的实体，并把它当作请求队列（Request-Line）中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能：

对现有资源的注释（Annotation of existing resources）

向电子公告栏、新闻组，邮件列表或类似讨论组发送消息

提交数据块，如将表单的结果提交给数据处理过程

通过附加操作来扩展数据库

调用HttpClient中的PostMethod与GetMethod类似，除了设置PostMethod的实例与GetMethod有些不同之外，剩下的步骤都差不多。在下面的例子中，省去了与GetMethod相同的步骤，只说明与上面不同的地方，并以登录清华大学BBS为例子进行说明。

构造PostMethod之前的步骤都相同，与GetMethod一样，构造PostMethod也需要一个URI参数，在本例中，登录的地址是[http://www.newsmth.net/bbslogin2.php](http://www.newsmth.net/bbslogin2.php)。

在创建了PostMethod的实例之后，需要给method实例填充表单的值，在BBS的登录表单中需要有两个域，第一个是用户名（域名叫id），第二个是密码（域名叫passwd）。表单中的域用类NameValuePair来表示，该类的构造函数第一个参数是域名，第二参数是该域的值；将表单所有的值设置到PostMethod中用方法setRequestBody。

另外由于BBS登录成功后会转向另外一个页面，但是HttpClient对于要求接受后继服务的请求，比如POST和PUT，不支持自动转发，因此需要自己对页面转向做处理。

具体的页面转向处理请参见下面的"自动转向"部分。代码如下：`
String url = "http://www.newsmth.net/bbslogin2.php"; 
PostMethod postMethod = new PostMethod(url); 
// 填入各个表单域的值 
NameValuePair[] data = { new NameValuePair("id", "youUserName"), 
new NameValuePair("passwd", "yourPwd") }; 
// 将表单的值放入postMethod中 
postMethod.setRequestBody(data); 
// 执行postMethod 
int statusCode = httpClient.executeMethod(postMethod); 
// HttpClient对于要求接受后继服务的请求，象POST和PUT等不能自动处理转发 
// 301或者302 
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||   
statusCode == HttpStatus.SC_MOVED_TEMPORARILY) { 
        // 从头中取出转向的地址 
        Header locationHeader = postMethod.getResponseHeader("location"); 
        String location = null; 
        if (locationHeader != null) { 
          location = locationHeader.getValue(); 
          System.out.println("The page was redirected to:" + location); 
        } else { 
          System.err.println("Location field value is null."); 
        } 
        return; 
} 
`
