这篇文章主要来介绍以下两种安卓开发中常用的网络请求
一 HttpUrlConnection
二 OkHttpClient
一 HttpUrlConnection
其实对于网络请求,大部分只要分清楚请求的需要和要实现的功能,然后根据功能添加到之间的代码中就可以了,代码部分基本上是没有大的变化的。
下面就是一个 HttpUrlConnection的POST请求为例
URL url;
try{
url = new URL("http://**.**.***:8080/req?action=sendMessage"); //创建URL对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //创建一个HTTP链接
conn.setRequestMethod("POST"); //规定为POST请求方式
conn.setDoOutput(true); //向链接中写入数据
conn.setDoInput(true); //从连接中读取数据
conn.setConnectTimeout(5000); //设置连接最大时常
conn.setReadTimeout(5000); //设置读取最大等待时常
OutputStream out = conn.getOutputStream(); //获取输出流
Log.e("RUN了吗》》》》》》444", "mmmmmmm");
out.write(content.getBytes()); //将要传递的数据写入输出流(只有POST请求需要)
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); //获取输入流对象
String line;
while((line = reader.readLine())!=null){ //readLine()是读取流读数据的时候用的,同时会以字符串形式返回这一行的数据,当读取完所有的数据时会返回null。
backMsg = line;
}
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上面就是一个以POST请求为例的网络请求,可以看到它需要将参数写进输出流里,这也是POST请求和GET请求的区别之处,那就是POST请求需要请求参数,而GET请求不需要。因此POST请求适用于例如进行登录、获取短信验证码等这样的操作。
如果是HttpUrlConnection进行GET请求,则不需要获取输出流OutputStream 以及向其中写入请求参数。另外,当没有在代码中明确规定是哪种请求时,默认为是GET请求。
二 OkHttpClient
除了上面讲到的HttpUrlConnection,也时常使用OkHttpClient进行网络请求
使用OKHttp需要添加dependencies依赖compile 'com.squareup.okhttp3:okhttp:3.4.1'
同样的,下面先以POST请求为例展示一段代码,而如果是GET请求,则不需要构建FormBody 请求体,再就是不需要在Request 里面进行post方法。
由此可见,POST请求的复杂度总体高于GET请求,不过还是要结合应用的具体需要进行请求方式的选择。
String url = "http://**.***.**.**:8080/water/mission.req?action=sendMessage"
String content = "188*******2"; //请求参数
OkHttpClient client = new OkHttpClient();
FormBody formBody = new FormBody.Builder() //传入请求参数
.add("phone", content) //
.build();
final Request request = new Request.Builder() //构建提交数据的请求
.url(url )
.post(formBody) //post请求
.build();
Call call = client.newCall(request); //发送请求
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("返回失败》》》》", String.valueOf(e)); //请求失败时可以打印出来错误代码
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){ //请求成功
Log.e("===============", response.body().string());
}
}
});
这里在我使用的过程中出现一直请求返回到onFailure里,于是打印出来IOException e,显示java.net.UnknownServiceException: CLEARTEXT communication to 1**.**.**.232 not permitted by network security policy
后来在网上找了好几种方法,说是需要添加xml文件。
具体步骤是在res目录下创建名为xml的包,再创建network-security-config.xml文件
内容
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在Manifest中application标签下声明android:networkSecurityConfig="@xml/network_security_config"
如果你也遇到同样的问题,可以试试上面的方法。
最后,既然是网络请求,就一定不要忘记在Manifest文件中添加网络权限。
<uses-permission android:name="android.permission.INTERNET" />
.
.
.
欢迎交流和指正。