- 如果要使用HttpClient开发包,需要将此开发包配置到项目的build path中
- 实现一个GET请求
- 原Servlet程序类
package shu.mao.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("*************"+req.getParameter("name"));
//服务端处理用户请求,并打印出请求参数
resp.getWriter().println("name = "+req.getParameter("name"));
}
}
- 该程序类在浏览器中的访问路径
http://localhost:8080/HelloProject/HelloServlet?name=Hello
- 定义一个TestGetDemo程序类访问get请求
package shu.xie.demo;
import java.io.IOException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
public class TestGetDemo {
public static void main(String[] args) throws Exception{
CloseableHttpClient httpClient = HttpClients.createDefault();
//定义请求路径
String url ="http://localhost:8080/HelloProject/HelloServlet?name=Hello";
//创建一个get请求
HttpGet httpGet = new HttpGet(url);
//执行get请求之后得到一个回应对象
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
//控制台输出服务端回应的内容
System.out.println(httpResponse.getEntity());
//输出当前状态数字代码(200表示请求成功)
System.out.println(httpResponse.getStatusLine().getStatusCode());
//输出回应内容
System.out.println(EntityUtils.toString(httpResponse.getEntity()));
}
}
- 控制台输出结果(TestGetDemo类)
- Tomcat控制台输出结果
4. 使用HttpClient发送一个post请求
- 在HelloServlet程序类中追加一个doPost()方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("####### POST请求处理"+req.getParameter("msg"));
//服务端处理用户请求,并打印出请求参数
resp.getWriter().println("msg = "+req.getParameter("msg"));
}
- 这里接收一个名为"msg"的提交参数,参数我们在设置请求路径的时候,并不直接把参数写在路径之中,而是通过HttpClient定义的UrlEncodedEntity来添加请求参数,具体操作如下
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("param1", "value1"));
formparams.add(new BasicNameValuePair("param2", "value2"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
HttpPost httppost = new HttpPost("http://localhost/handler.do");
httppost.setEntity(entity)
- 以上的操作,会将使用指定的编码生成以下内容
param1=value1¶m2=value
- 于是我们可以通过以上的方法,在要进行访问的普通java类中进行添加提交参数,从而向HTML表单一样定义提交参数
- 定义TestPostDemo程序类
package shu.xie.demo;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Consts;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
public class TestPostDemo {
public static void main(String[] args) throws Exception{
CloseableHttpClient httpClient = HttpClients.createDefault();
//定义请求路径
String url ="http://localhost:8080/HelloProject/HelloServlet";
//创建一个post请求
HttpPost httpPost = new HttpPost(url);
//将请求参数进行封装
List<NameValuePair> parames = new ArrayList<NameValuePair>();
parames.add(new BasicNameValuePair("msg","你好世界"));
parames.add(new BasicNameValuePair("name","Xiemaoshu"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parames,Consts.UTF_8);
httpPost.setEntity(entity);
//执行post请求之后得到一个回应对象
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
//控制台输出服务端回应的内容
System.out.println(httpResponse.getEntity());
//输出当前状态数字代码(200表示请求成功)
System.out.println(httpResponse.getStatusLine().getStatusCode());
//输出回应内容
InputStream input = httpResponse.getEntity().getContent();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int x = 0;
while((x=input.read(data)) != -1){
bos.write(data,0,x);
}
System.out.println(new String(bos.toByteArray()));
}
}
- 因为提交参数有设置中文,所以Servlet类上要设置request和response编码格式
- 控制台输出结果(TestPostDemo类)
- Tomcat控制台输出结果