搭建本地server,响应Android客户端HTTP请求

有些时候,我们可能需要自己搭建本地服务器,来测试某个客户端功能(公共API不满足自己需要的情况下),如果自己写接口,写在servlet中方便点。本文以普通的get,post请求为例,分享下如何搭建本地Server(Tomcat+servlet),测试网络请求,并演示HttpURLConnection的使用。

一,安装Eclipse for JavaEE

官方下载:http://www.eclipse.org/downloads/
直接傻瓜安装,另外自行安装jdk,tomcat。

二,创建server项目

1,运行Eclipse,File->Dynamic Web project

Create a standalone Dynamic Web project or add it to a new or existing Enterprise Application.

2,新建servlet,配置web.xml

新建LoginServlet,如果报错,自行导入servlet库(项目属性->Build Path->add Libraries),安装了tomact也有这个。
查看配置文件,位于项目根目录WEB-INF/web.xml,确保有url映射。

1
2
3
4
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>

3,写服务端代码,根据参数返回json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("username");
if(name!=null&&!"".equals(name)){
String result = "\""+name+"\"";
out.write("{\"name\":"+result+"}");
return;
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

如果写在jsp里面,可以这样:

1
2
3
4
5
6
7
<body>
<%
String name=request.getParameter("username");
String age=request.getParameter("age");
out.println("用户名="+name+",年龄="+age);
%>
</body>

三,创建android项目

使用android stduio 创建简单的工程。访问上面创建的servlet,如果是真机,需要改localhost为pc的IP地址。
别忘了权限:

1
<uses-permission android:name="android.permission.INTERNET"/>

我使用HttpURLConnection演示请求的过程,不建议使用httpClinet,android 6.0已经废弃它了,要使用必需添加依赖:

1
useLibrary 'org.apache.http.legacy'//android 6.0(api23) 后,不再提供org.apache.http.*(只保留几个类).

如果是请求一个jsp页面,将返回整个页面的源代码。以上servlet仅仅out.write一个字符串,所以客户端接受到的只有json字符串。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public static void testHttpURLConnection() {
// 1.获取请求的路径:改成你自己的
//final String path ="http://192.168.10.245:8080/Android/index.jsp?username=duqian&age=25";//get
final String path ="http://192.168.100.47:8080/Android/servlet/LoginServlet";//post
HttpURLConnection conn = null;
InputStream is = null;
try {
// 2.获取url对象
URL url = new URL(path);
// 3.得到连接的对象
conn = (HttpURLConnection) url.openConnection();
// 4.设置连接的参数
// 设置请求方式
//conn.setRequestMethod("GET");
conn.setRequestMethod("POST");
// 设置连接超时时间
conn.setConnectTimeout(5000);
// 设置读取数据的超时时间
conn.setReadTimeout(5000);
conn.setUseCaches(false);// Post 请求不能使用缓存
// 设置允许读取服务器端返回的数据
conn.setDoInput(true);
// 5.连接服务器
//conn.connect();//如果是post请求,不要加这个,否则可能IllegalStateException: Already connected
//如果是get请求,参数写url中,就不需要post参数
conn.setDoOutput(true);//4.0中设置httpCon.setDoOutput(true),将导致请求以post方式提交
final OutputStream outputStream = conn.getOutputStream();
outputStream.flush();
outputStream.write("username=dusan".getBytes("UTF-8"));
outputStream.close();
// 6.获取返回的服务器端的响应码。
int responseCode = conn.getResponseCode();
// 7.只有响应码是200时,方可正常读取
if (200==responseCode) {
is = conn.getInputStream();
// 将获取的输入流中的数据转换为字符串
final String content=StreamTools.readStream(is);
LogUtils.debug(TAG,"content="+content);
}else{
LogUtils.debug(TAG,"responseCode="+responseCode);
}
}catch (Exception e){
LogUtils.debug(TAG,e.toString());
}
}

将接受到的字节流转化成字符串,UTF-8编码格式。

1
2
3
4
5
6
7
8
9
10
11
12
public static String readStream(InputStream in) throws Exception{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte buffer[] = new byte[1024];
while((len=in.read(buffer))!=-1){
baos.write(buffer, 0, len);
}
in.close();
return new String(baos.toByteArray(),"UTF-8");
//return new String(baos.toByteArray());
}

以上代码,get和post请求写在了一起,并且jsp和servet页面都有测试。如果是get请求,就把参数写在url地址上面,否则以流的形式向服务端发送。
servlet返回的形式,通常的接口都以json格式返回result,方便解析处理。如:

1
{"name":"duqian-291902259"}

四,总结

如果自己写接口,写在servlet中方便点,如果写在jsp返回的是全面页面内容。多个参数也一样处理。
杜乾,Dusan,Q 291902259,欢迎交流。