Okhttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架。
接下来我们就来实现一下这个用Okhttp搭建一个android客户端访问java服务端的项目。
网上有很多这样的例子,但都是只有android客户端的,这篇文章把服务端代码也贴一下,这样有许多同学就可以完全在自己的机器上面部署环境来开发测试了。
首先新建一个anroid studio项目,在依赖库里面增加对okhttp库的引用
compile 'com.squareup.okhttp:okhttp:2.7.5'
然后在AndroidManifest.xml里面增加权限
<uses-permission android:name="android.permission.INTERNET">uses-permission>
新建一个Activity,然后在布局文件里面增加一个Button,点击这个Button的时候我们去向服务器发送一个GET请求。关键代码如下:
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String url = "http://192.168.23.1:7111/web02/base";
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
String error = e.getMessage();
}
@Override
public void onResponse(Response response) throws IOException {
if(response.isSuccessful()){
String json = response.body().toString();
InputStream is = response.body().byteStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int readed = 0;
byte buf[] = new byte[1024];
while ((readed = is.read(buf, 0, buf.length)) != -1) {
bos.write(buf, 0, readed);
}
byte[] result = bos.toByteArray();
Log.d("result","result:"+ new String(result));
is.close();
bos.close();
buf=null;
}
}
});
}
});
这里的url只是我本地测试的url,有的同学会问,我自己本地的url是多少呢?
如果是用同一台机器上的tomcat部署服务端的,怎么在自己的机器上部署能让自己的手机客户端访问到。
在用myeclipse发布一个程序到tomcat上后,用ipconfig命令测试下自己机器的ip。
找到无线局域网的IPV4地址,这里是192.168.23.1。 端口号如果不知道的,可以去tomcat下面的server.xml里面查看部署的端口号是多少。我这里已经查看过了,是7111。
注意,要让你的手机和你的笔记本保持在一个局域网里面,你的手机可以访问这个地址,进而访问你笔记本上部署的tomcat服务。
所以在客户端程序代码里面url里面地址配置成http://192.168.23.1:7111/项目名/具体方法名(servlet)";比方说上面的例子,我是写成String url = http://192.168.23.1:7111/web02/base;
好了。
客户端完成后,接下来是服务端的编写。
服务端很简单,写一个简单的Servlet去接受数据。
package com.example.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*/
public class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
handleRequest(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost");
handleRequest(req,resp);
}
private void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8"); // 设置字符集
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Cache-Control", "no-store");
PrintWriter out = resp.getWriter(); // 准备输出
out.println("");
out.println("WEB开发 ");
out.println("");
out.println("Hello World
");
out.println("");
out.println("");
out.close();// 关闭输出
}
}
BaseServlet当中重写了 doGet方法和doPost方法,在这里我把两种请求方式都做了统一处理。要注意的是,要删掉原来servlet里面的super.doGet()方法和super.doPost(),否则在OkHttp的 response.isSuccessful())里面会返回失败。为什么会这样呢?我们找到Response类的源代码
/**
* Returns true if the code is in [200..300), which means the request was
* successfully received, understood, and accepted.
*/
public boolean isSuccessful() {
return code >= 200 && code < 300;
}
哦,其实就是判断这个code是否等于200.因为servlet默认的super.doGet()方法里面返回的code是405,所以这里面如果保留super.doGet()会出错。
OK,最后在配置文件web.xml里面配置刚才写的Servelt
<servlet>
<servlet-name>baseservlet-name>
<servlet-class>com.example.servlet.BaseServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>baseservlet-name>
<url-pattern>/baseurl-pattern>
servlet-mapping>
最后测试一下,控制台打印返回的xml信息,说明连接成功。