网络与数据存储
如何发起一个请求,代码如下
//package
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public void sendRequest(String method) {
// 拼接地址
URL weatherAPIUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) weatherAPIUrl.openConnection();
// 设置发送方式
connection.setRequestMethod("GET");
// 超时时间
connection.setConnectTimeout(5000);
// 添加参数
connection.setRequestProperty("apikey", "11111");
// 如果是post,那么将请求内容封装到OutputStream
if (method.trim().equalsIgnoreCase("post")) {
connection.setDoOutput(true);
OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
BufferedWriter bufferedWriter = new BufferedWriter(osw);
bufferedWriter.write(postString);
bufferedWriter.flush();
bufferedWriter.close();
osw.close();
}
connection.connect();
// 获取响应编码
int responseCode = connection.getResponseCode();
// 200 为正常
if (responseCode == 200) {
InputStreamReader isr = new InputStreamReader(connection.getInputStream(), "UTF-8");
BufferedReader bufferedReader = new BufferedReader(isr);
StringBuffer result = new StringBuffer();
String line = "";
// 这里使用Reader的封装类来读取数据
while ((line = bufferedReader.readLine()) != null) {
result.append(line);
}
bufferedReader.close();
isr.close();
return result.toString();
}
}
如何发起异步请求
如果我们将上边的代码运行在一个Activity中是不可以的,理由是你的请求得不到服务器的响应,那么整个UI线程都会卡在这里直到,到达你设置的超时时间,所以这种情况是不被google所允许的.
下边我们就来看看如何发起异步请求.
// 最简单的就是使用匿名内部类了
try {
// 尖括号里的参数,第一个是参数的类型, 第二个是一个进度类型, 第三个是返回的结果类型
String a = new AsyncTask<Integer, Integer, String>() {
@Override
// 这里需要注意的是 Integer... ,这里表示的是 你可以传入一个 整型值,也可传入若干个整形值,还可以直接传入一个整型数组,但是这种用法一定要保证是在参数列表的最后
protected String doInBackground(Integer... integers) {
return null;
}
}.execute(0, 0, 0).get(); // 执行发放并且获取返回值
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
XML 与 JSON 的解析
xml解析
XML 一种可拓展标记语言,一种十分灵活的数据传输格式.
你可以看到HTML文件就是一个xml,在HTML中除了已定义的元素及属性,你还可以自定义一个元素的属性,然后通过JavaScript来操作
下边我们来看一个示例
<xml>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<attach><![CDATA[支付测试]]></attach>
<bank_type><![CDATA[CFT]]></bank_type>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
<openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
<out_trade_no><![CDATA[1409811653]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
<sub_mch_id><![CDATA[10000100]]></sub_mch_id>
<time_end><![CDATA[20140903131540]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>
这里需要说明一下的是 <![CDATA[ ]]> 如果在一个元素内使用了这对标签那么里面的任何内容将不再具有特殊的意义,必须<,> 他们将被视作一个字符,而不是一个元素标签的开始:< xml>
下面来看一段xml解析的代码
public String convertToObj(String xml) throws UnsupportedEncodingException, DocumentException {
try {
SAXReader reader = new SAXReader(DocumentFactory.getInstance());
Document document = reader.read(new ByteArrayInputStream(xml.getBytes("UTF-8")));
Element rootElement = document.getRootElement();
//如果return_code不为空,并且等于success,那么继续取值,否则直接获取错误信息
String return_code = rootElement.elementText("return_code");
if (!ToolsUtil.isEmpty(return_code) && return_code.equalsIgnoreCase("success")) {
this.return_code = return_code;
this.appid = rootElement.elementText("appid");
this.mch_id = rootElement.elementText("mch_id");
this.sign = rootElement.elementText("sign");
this.err_code = rootElement.elementText("err_code");
this.err_code_des = rootElement.elementText("err_code_des");
//如果result_code不为空,并且等于success,那么继续取值,否则直接获取错误信息
String result_code = rootElement.elementText("result_code");
if (!ToolsUtil.isEmpty(result_code) && result_code.equalsIgnoreCase("success")) {
this.result_code = result_code;
this.trade_type = rootElement.elementText("trade_type");
this.prepay_id = rootElement.elementText("prepay_id");
this.code_url = rootElement.elementText("code_url");
} else {
return rootElement.elementText("err_code_des");
}
} else {
return rootElement.elementText("return_msg");
}
} catch (UnsupportedEncodingException e) {
} catch (DocumentException e) {
}
return null;
}
JSON解析
JavaScript 对象表示法(JavaScript Object Notation)。
他比xml更加的简练,更容易阅读.
在JSON中需要知道一些要点:
1.JSON只支持3中最基本的类型, 整形, 布尔, 字符串,表示方法: “key”:true, “key”:”val”, “key”:123123
2.{} 表示一个对象,他可以由上边提到的3中类型的值组成
3.[] 表示一个数组,[] 里面只能由>=1的 {} 组成
4.分隔符均是 “,”
下边来看一个具体的解析示例:
我有如下一个JSON串
{"success":true,"count":1,"data":[{"number":"18901434764","content":"sdfsdf","id":"201608240921100315603"}]}
解析JSON需要用到 JSONObject 与 JSONArray 类
前者表示一个json对象,后者表示一个json数组,那么我们应该用哪个那?
我们来看一下上边的json串,首先他的最外围是由 { } 包裹的,也就是说转换成json后他是一个JSONObject类型,反之如果是[] 包裹的就是一个JSONArray 类型
// 这里我们用的都是org.json包下的类
String json = "{\"success\":true,\"count\":1,\"datas\":[{\"number\":\"18901434764\",\"content\":\"sdfsdf\",\"id\":\"201608240921100315603\"}]}";
try {
JSONObject jsonObject = new JSONObject(json);
// 获取datas 中的内容
JSONArray datas = jsonObject.getJSONArray("datas");
} catch (JSONException e) {
e.printStackTrace();
}
还有一种方式是GSON 一个Google 提供的工具类.
他的原理是将一个JSON串 解析成对应的实体数据.
为此我们就需要与json串对应的实体类,在这里需要特别指出的是,对于这些实体类中的属性,你可以不一一对应,比如:Result类,只有success属性,那么他只会把存在属性数据解析出来
其次我们在创建JSON串的时候需要慎重的处理JSON结构,比如:有些地方明明只需要一个{}就可以表达,而不要用[{}] 数组的方式,这样只会给别人带来麻烦,不信你试试