一、什么是网络请求?
主要学习的http相关的网络请求,可以通过客户端发送请求获取服务端的数据,是现在主要的数据获取来源。
二、为什么需要用网络请求
这个感觉不用多说,大家天天都在用的,看网页、用APP都会用到网络请求,没有网络简直没法活。
三、如何使用
关于如何使用是个大课题,相关的书籍一大堆,我只谈下我的理解,首先要建立链接,然后通过GET或POST来提交申请,服务器就会根据申请来返回数据。GET,POST,PUT,DELETE其实分别对应着增删改查,这边主要讲讲GET和POST
关于GET和POST的区别
GET就是单纯的获取和查询数据资源,不会对服务器的数据有任何影响,而且中间没什么安全措施,基本都是明文状态提交查询需求和获取数据资源,也是用的最多的一个请求方法。
POST对应着改动服务器数据,一般会用对象的形式提交数据,可以提交比较大的数据,而且安全性会好一点。比如:论坛中发出的帖子,再做编辑修改,就要用POST。
具体用法,实力码代码先。。
public class HttpThread extends Thread {
private String url;
private WebView webView;
private Handler handler;
public HttpThread(String url, Handler handler, WebView webView) {
this.url = url;
this.webView = webView;
this.handler = handler;
}
@Override
public void run() {
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
final StringBuffer stringBuffer = new StringBuffer();
String str = null;
while((str=reader.readLine())!=null){
stringBuffer.append(str);
}
Log.i("info","sb = " + stringBuffer.toString());
handler.post(new Runnable() {
@Override
public void run() {
webView.loadData(stringBuffer.toString(),"text/html;charset=utf-8",null);
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
因为请求网络资源属于耗时操作,所以要在子线程中执行,这边再使用handler传递消息给主线程,由主线程来更新UI界面之类的任务。
这个例子中先通过
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
建立链接
然后设置链接相关属性
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
最后获取数据
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
final StringBuffer stringBuffer = new StringBuffer();
String str = null;
while((str=reader.readLine())!=null){
stringBuffer.append(str);
}
最后的最后通过handler执行界面更新
handler.post(new Runnable() {
@Override
public void run() {
webView.loadData(stringBuffer.toString(),"text/html;charset=utf-8",null);
}
});
主线程中直接调用就OK了。
new HttpThread("http://www.baidu.com/",handler,webView).start();
这只是一个简单的例子,可以看到这个方法很有局限性,不方便复用,只能完成简单的数据获取。
有时间我再更新一下静态的http调用方法。。
更新一下,静态调用http请求的方法。
HTTP连接的类的静态调用
因为http连接是耗时操作,不能直接在主线程中执行,所以需要新建一个子线程,但是子线程中的数据何时从服务器端发送回来,无法预知,那如何从子线程中把数据传递到主线程呢?
我们可以新建一个回调接口,用回调的方式来发送数据
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}
然后建立HttpUtil类
public class HttpUtil {
public static void sendHttpRequest(final String address,final HttpCallbackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection conn = null;
try {
URL url = new URL(address);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000);
// conn.getDoInput(true);
// conn.getDoOutput(true);
InputStream is = conn.getInputStream();
StringBuilder response = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null){
response.append(line);
}
if (listener != null){
//回调onFinish方法
listener.onFinish(response.toString());
}
} catch (Exception e) {
e.printStackTrace();
if (listener != null){
//回调onError
listener.onError(e);
}
}
}
}).start();
}
}
在静态方法中,加入回调接口类的参数,将消息数据传入到onFinish()方法中,其他类调用该静态方法时,就可以通过实现接口的方法,调用到数据。不过此时还是在子线程中,还是需要用handler发送出去消息。
HttpUtil.sendHttpRequest(url, new HttpCallbackListener() {
@Override
public void onFinish(String response) {
Message msg = new Message();
msg.obj = response;
handler.sendMessage(msg);
}
@Override
public void onError(Exception e) {
}
});