有些时候,我们可能需要自己搭建本地服务器,来测试某个客户端功能(公共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'
|
如果是请求一个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() { final String path ="http://192.168.100.47:8080/Android/servlet/LoginServlet"; HttpURLConnection conn = null; InputStream is = null; try { URL url = new URL(path); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); final OutputStream outputStream = conn.getOutputStream(); outputStream.flush(); outputStream.write("username=dusan".getBytes("UTF-8")); outputStream.close(); int responseCode = conn.getResponseCode(); 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"); }
|
以上代码,get和post请求写在了一起,并且jsp和servet页面都有测试。如果是get请求,就把参数写在url地址上面,否则以流的形式向服务端发送。
servlet返回的形式,通常的接口都以json格式返回result,方便解析处理。如:
1
| {"name":"duqian-291902259"}
|
四,总结
如果自己写接口,写在servlet中方便点,如果写在jsp返回的是全面页面内容。多个参数也一样处理。
杜乾,Dusan,Q 291902259,欢迎交流。