在上一篇文章中,我们实现了获取服务器返回数据的工具类。没有读过的朋友可以点击下面链接:
http://www.cnblogs.com/fuly550871915/p/4852568.html
这一篇文章要在上一篇的基础上,实现两个重要的实体类,一个是ChatMsg,用来封装数据从而实现标准的消息格式;一个是ResultMsg,用来封装从服务器端返回的数据。
一、准备工作
在这里,解析json字符串,我们打算使用第三方包GSON。首先点击下面的地址,下载该包。
http://code.google.com/p/google-gson/downloads/list
下面完成后解压,将gson-2.2.4添加到项目的libs目录下即可。
二、编写实体类
首先编写ResultMsg类。为什么需要这样一个类呢?这是因为我们打算从服务器端返回的数据中提取字段code和字段text的包含的信息。因此我们编写类ResultMsg,它有两个String成员变量,分别就是code 和text。这样子,使用gson解析数据,就会直接将服务器端的数据截取code和text两个字段信息映射为一个ResultMsg对象,即封装为一个ResultMsg对象。 好了,ResultMsg的代码很简单,如下:
1 package com.fuly.kun.bean; 2 3 4 //用来封装从服务器端返回的数据 5 //从服务器端返回的数据主要包括code和Text字段 6 public class ResultMsg { 7 8 9 private String code; 10 private String text; 11 12 13 14 public String getCode() { 15 return code; 16 } 17 public void setCode(String code) { 18 this.code = code; 19 } 20 public String getText() { 21 return text; 22 } 23 public void setText(String text) { 24 this.text = text; 25 } 26 27 28 29 }
然后再编写ChatMsg类。那么为什么需要这样一个类呢?其实就是为了生成我们的标准的消息。从前面的运行效果的界面可以看到,一个标准的消息,应该包括消息内容,消息的时间,消息的类型(是自己发送的消息还是从服务器端返回的消息)。看我们的代码吧,如下:
1 package com.fuly.kun.bean; 2 3 import java.util.Date; 4 5 6 //用来把从服务器端获得的数据或者我们发送的消息变成一个标准的消息格式 7 //应该包括消息文本,获取的时间,以及消息的类型(是从服务器端获取的还是我们自己发送的) 8 9 public class ChatMsg { 10 11 private String msg;//消息 12 private Date date;//日期 13 private Type type;//消息类型 14 15 public enum Type{ 16 17 INPUT,OUTPUT 18 } 19 20 21 22 public ChatMsg() { 23 24 25 } 26 27 public ChatMsg(String msg, Date date, Type type) { 28 this.msg = msg; 29 this.date = date; 30 this.type = type; 31 } 32 33 public String getMsg() { 34 return msg; 35 } 36 37 public void setMsg(String msg) { 38 this.msg = msg; 39 } 40 41 public Date getDate() { 42 return date; 43 } 44 45 public void setDate(Date date) { 46 this.date = date; 47 } 48 49 public Type getType() { 50 return type; 51 } 52 53 public void setType(Type type) { 54 this.type = type; 55 } 56 57 58 }
三、HttpUtil类的第二次编写
之前在HttpUtil中,我们只实现了获取服务器返回的数据的方法(即doGet()方法)。它获取的是一个json类型的字符串。下面我们要实现解析这个字符串,并且顺便将其封装为一个标准的消息。HttpUtil修改如下:
1 package com.fuly.kun.util; 2 3 import java.io.BufferedReader; 4 import java.io.ByteArrayOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.InputStreamReader; 8 import java.io.UnsupportedEncodingException; 9 import java.net.HttpURLConnection; 10 import java.net.MalformedURLException; 11 import java.net.ProtocolException; 12 import java.net.URL; 13 import java.net.URLEncoder; 14 import java.util.Date; 15 16 import android.util.Log; 17 18 import com.fuly.kun.bean.ChatMsg; 19 import com.fuly.kun.bean.ChatMsg.Type; 20 import com.fuly.kun.bean.ResultMsg; 21 import com.google.gson.Gson; 22 import com.google.gson.JsonSyntaxException; 23 24 25 //该类用来向服务器发送消息以及处理从服务器返回的数据 26 public class HttpUtil { 27 28 29 //该方法用来解析从服务器端获得的数据,封装为ChatMsgMsg对象 30 31 public static ChatMsg getResultMsg(String jsonData){ 32 33 34 35 ChatMsg cm = new ChatMsg(); 36 37 ResultMsg rm = null; 38 try { 39 //下面两句代码已经完成了json数据的提取和封装 40 Gson gson = new Gson(); 41 rm = gson.fromJson(jsonData, ResultMsg.class); 42 cm.setMsg(rm.getText().toString()); 43 44 } catch (Exception e) { 45 cm.setMsg("服务器异常,请重新尝试"); 46 } 47 48 cm.setDate(new Date()); 49 cm.setType(Type.OUTPUT);//消息类型为OUTPUT,即从服务器端返回的 50 return cm; 51 52 } 53 54 55 //该方法用来处理从服务器返回的数据 56 public static String doGet(String msg){ 57 58 //获取相应的网址 59 URL msgUrl = setMsgParam(msg); 60 61 62 63 HttpURLConnection connection = null; 64 try { 65 //然后开始和服务器建立连接 66 connection = (HttpURLConnection) msgUrl.openConnection(); 67 68 connection.setRequestMethod("GET"); 69 connection.setConnectTimeout(5000); 70 connection.setReadTimeout(5000); 71 } catch (ProtocolException e) { 72 73 e.printStackTrace(); 74 } catch (IOException e) { 75 76 e.printStackTrace(); 77 } 78 InputStream in = null; 79 try { 80 //下面对获得输入流进行读取 81 82 in = connection.getInputStream(); 83 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 84 StringBuilder response = new StringBuilder(); 85 String line ; 86 while((line = reader.readLine())!= null){ 87 response.append(line); 88 } 89 90 String str = response.toString(); 91 //因为发现从服务器端返回的json数据中,经常带有特殊字符<br> 92 //所以在这里特地将该特殊字符替换为转义字符\n 93 str = str.replace("<br>", "\n"); 94 return str; 95 96 } catch (IOException e) { 97 98 e.printStackTrace(); 99 }finally{ 100 if(connection != null){ 101 connection.disconnect(); 102 } 103 if(in != null){ 104 try { 105 in.close(); 106 } catch (IOException e) { 107 e.printStackTrace(); 108 } 109 } 110 } 111 112 return null; 113 114 } 115 116 //该方法用来返回相应的网址 117 private static URL setMsgParam(String msg) { 118 119 //注意此处应写你自己的api key 120 String APIKEY = "761b4f79ebdf8b26d0bf7e0c816b32b4"; 121 122 try { 123 //将编码格式设置为utf-8,千万别忘记这一步 124 String mMsg = URLEncoder.encode(msg, "utf-8"); 125 String getURL = "http://www.tuling123.com/openapi/api?key=" + APIKEY + "&info=" + mMsg; 126 URL getUrl = new URL(getURL); 127 128 return getUrl; 129 } catch (UnsupportedEncodingException e) { 130 e.printStackTrace(); 131 } catch (MalformedURLException e) { 132 e.printStackTrace(); 133 } 134 135 return null; 136 137 } 138 139 }
好了,至此,我们的项目算是成功一半了。从服务器端获取数据并封装为标准消息的工作我们已经完成了。不过现在我们完成的都是看不见的工作,在下一篇中,我们来实现可以看得见的工作吧。