这篇文章主要来介绍以下两种安卓开发中常用的网络请求

一 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" /> .
.
.

欢迎交流和指正。