初识安卓之从web服务器上获取资源显示到手机,实现手机归属地查询功能
主界面上负责显示的代码
public class MainActivity extends Activity {
private EditText numET;
private TextView addressTV;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
numET = (EditText) findViewById(R.id.numET);
addressTV = (TextView) findViewById(R.id.addressTV);
}
点击查询按钮时,执行请求
public void query(View view) {
try {
//获取用户输入的电话号码
String num = numET.getText().toString();
//拿着这个电话号码去访问归属地服务器
QueryService service = new QueryService();
//服务器返回一个结果值
String address = service.query(num);
//把结果值设置到对应文本控件上给客户看
addressTV.setText(address);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "服务器忙!", 0).show();
}
}
}
以下为负责具体请求的服务层代码
public class QueryService {
public String query(String num) throws Exception {
//将准备好的存在本地磁盘上的,要发给服务器的xml文件(内含一个占位符phoneNum,后面要被替换为用户输入的待查询电话号码),加载到输入流中
InputStream in = QueryService.class.getClassLoader().getResourceAsStream("template.xml");
//利用工具类将输入流转为含有xml中所有内容的字符串data(xml文件->流->xml字符串),便于进行文本替换
String data = new String(Util.read(in));
in.close();
//将xml字符串中的占位符替换成待查询的电话号码
data = data.replace("phoneNum", num);
//创建要请求的服务器网址对象,将xml字符串作为正文内容发给服务器
URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");
//打开链接,开始请求
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
//必须设置的请求头
conn.setRequestMethod("POST");
conn.setRequestProperty("Host", "webservice.webxml.com.cn");
conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
conn.setRequestProperty("Content-Length", data.getBytes().length + "");
conn.setDoOutput(true);
//发出!
conn.getOutputStream().write(data.getBytes());
//获取服务器的响应:
int code = conn.getResponseCode();
if (code == 200) {
//解析服务器发以流的形式发回来的xml,得到归属地结果
return parseAddress(conn.getInputStream());
}
throw new NetworkErrorException("服务器出错: " + code);
}
//接收服务器返回的xml型的流文件
private String parseAddress(InputStream inputStream) throws Exception {
//创建pull解析对象
XmlPullParser parser = Xml.newPullParser();
//将服务器返回的流交给解析器,并告知解析器按照utf-8将流解析成字符串
parser.setInput(inputStream, "UTF-8");
//只要没读到结束文档的标签,就不停的向下一个标签进行解析
for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT;
type = parser.next()) {
//精准定位名字为"getMobileCodeInfoResult"的开始标签,获取标签名:parser.getName()
if (type == XmlPullParser.START_TAG &&
parser.getName().equals("getMobileCodeInfoResult")) {
//返回改标签的文本
return parser.nextText();
}
}
return null;
}
}
以下为请求服务器时,需要给服务器发的xml文件,具体格式参见服务器的格式要求
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getMobileCodeInfo xmlns="http://WebXml.com.cn/">
phoneNum作为占位符,等xml被读取到后,其被替换成用户输入的电话号码
<mobileCode>phoneNum</mobileCode>
<userID></userID>
</getMobileCodeInfo>
</soap12:Body>
</soap12:Envelope>