上面的请求头中,我们可以看到cookie不同变量之间是用分号间隔的,没有包含phpsessionid。在某些处理http协议的java包中,可以看到对header的生成提供了专门的方法,类似于addHeader()这样的,有的还封装了专门针对cookie的方法,搞得好像cookie和header是两码事,我在用org.apache.http的时候都被搞晕了。http协议很简单,能放数据的地方真的不多,那些额外的数据几乎都是放在header中。
所以我还是觉得在使用那些看似方便的包之前还是从最基础的java.net.HttpURLConnection来实现http联网操作。
使用java.net
使用java.net一般只需引入两个类就可以了:import java.net.HttpURLConnection;
import java.net.URL;
准备
首先你需要一个url,以及字符集charset,url后面的参数为可选的。如下在代码中先定义url、字符集以及由两个参数param1,param2组成的查询参数。String url = "http://example.com";
String charset = "UTF-8";
String param1 = "value1";
String param2 = "value2";
// ...
String query = String.format("param1=%s¶m2=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(param2, charset));
查询参数都是有name=value这种形式组成的不同的name=value
之间用&分割。参数可以用 URL-encode指定字符集,
发起一个get请求
代码如下:URLConnection connection = new URL(url + "?" + query).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
// ...
在url与查询条件之间需要用‘?’连接请求头Accept-Charset暗示服务器传入的参数是何种字符集,如果你根本没有参数,可以不用在header中保留Accept-Charset一项。如果你连header都不需要,发起一个get请求甚至可以简化成这样:InputStream response = new URL(url).openStream();
// ...
实际上发出get请求我们还需要指定method为getconnection.setRequestMethod("GET");
但是默认请求就是get的因此上面那行代码也可以不要。
发起post请求
将URLConnection#setDoOutput()设置为true则意味着请求是post的,即使调用了
setDoOutput(true)会使setRequestMethod("GET")无效。URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true); // Triggers POST.
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
OutputStream output = connection.getOutputStream();
try {
output.write(query.getBytes(charset));
} finally {
try { output.close(); } catch (IOException logOrIgnore) {}
}
InputStream response = connection.getInputStream();
// ...