|
??Okhttp是一個處理網(wǎng)絡(luò)請求的開源項(xiàng)目,是安卓端最火熱的輕量級框架。
接下來我們就來實(shí)現(xiàn)一下這個用Okhttp搭建一個android客戶端訪問java服務(wù)端的項(xiàng)目。
網(wǎng)上有很多這樣的例子,但都是只有android客戶端的,這篇文章把服務(wù)端代碼也貼一下,這樣有許多同學(xué)就可以完全在自己的機(jī)器上面部署環(huán)境來開發(fā)測試了。
首先新建一個anroid studio項(xiàng)目,在依賴庫里面增加對okhttp庫的引用
compile 'com.squareup.okhttp:okhttp:2.7.5'
然后在AndroidManifest.xml里面增加權(quán)限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
新建一個Activity,然后在布局文件里面增加一個Button,點(diǎn)擊這個Button的時候我們?nèi)ハ蚍?wù)器發(fā)送一個GET請求。關(guān)鍵代碼如下:
- 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,有的同學(xué)會問,我自己本地的url是多少呢?
如果是用同一臺機(jī)器上的tomcat部署服務(wù)端的,怎么在自己的機(jī)器上部署能讓自己的手機(jī)客戶端訪問到。
在用myeclipse發(fā)布一個程序到tomcat上后,用ipconfig命令測試下自己機(jī)器的ip。

找到無線局域網(wǎng)的IPV4地址,這里是192.168.23.1。 端口號如果不知道的,可以去tomcat下面的server.xml里面查看部署的端口號是多少。我這里已經(jīng)查看過了,是7111。
注意,要讓你的手機(jī)和你的筆記本保持在一個局域網(wǎng)里面,你的手機(jī)可以訪問這個地址,進(jìn)而訪問你筆記本上部署的tomcat服務(wù)。
所以在客戶端程序代碼里面url里面地址配置成http://192.168.23.1:7111/項(xiàng)目名/具體方法名(servlet)";比方說上面的例子,我是寫成String url =
http://192.168.23.1:7111/web02/base;
好了。
客戶端完成后,接下來是服務(wù)端的編寫。
服務(wù)端很簡單,寫一個簡單的Servlet去接受數(shù)據(jù)。
- 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"); // 設(shè)置字符集
- resp.setCharacterEncoding("UTF-8");
- resp.setHeader("Cache-Control", "no-store");
- PrintWriter out = resp.getWriter(); // 準(zhǔn)備輸出
- out.println("<html>");
- out.println("<head><title>WEB開發(fā)</title></head>");
- out.println("<body>");
- out.println("<h1>Hello World</h1>");
- out.println("</body>");
- out.println("</html>");
- out.close();// 關(guān)閉輸出
-
- }
- }
BaseServlet當(dāng)中重寫了 doGet方法和doPost方法,在這里我把兩種請求方式都做了統(tǒng)一處理。要注意的是,要刪掉原來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;
- }
哦,其實(shí)就是判斷這個code是否等于200.
因?yàn)閟ervlet默認(rèn)的super.doGet()方法里面返回的code是405,所以這里面如果保留super.doGet()會出錯。
OK,最后在配置文件web.xml里面配置剛才寫的Servelt
<servlet>
<servlet-name>base</servlet-name>
<servlet-class>com.example.servlet.BaseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>base</servlet-name>
<url-pattern>/base</url-pattern>
</servlet-mapping>
最后測試一下,控制臺打印返回的xml信息,說明連接成功。

|