[Android studio]模拟http请求调用后台接口

[Android studio]模拟http请求调用后台接口

    • 描述
    • 内容
    • 问题

描述

如题。这么说吧,我们可以把所有绘制页面的部分称之为‘前台’,所有实现逻辑的部分称之为‘后台’,当我们完成了前台页面的绘制之后,通过与前台页面上的控件发生交互,从而获取到所需要使用的信息/数据,然后我们需要使用这些信息/数据来完成某项功能。(为了方便解释,我们举个栗子来方便说明)
例如:我们需要完成登录功能。
首先,我们需要完成前台页面的绘制;
然后,通过前台交互获取到用户的账号和密码;
再然后,将账号和密码发送到后台进行逻辑处理,并返回结果给前台;
最后,由前台接收到返回的结果,并做出相应的处理。

内容

关于如何绘制页面,以及如何与前台页面发生交互,我这里就不做赘述了,我们直接进入正题。

//GET请求方式

//访问地址
String getUrl = "";
try{
	//创建URL对象
	URL url = new URL(getUrl);
	HttpURLConnection connection = (HttpURLConnection) url.openConnection();//开启连接
	connection.setRequestMethod("GET");
	connection.connect();//连接服务器
	//至此,只要地址正确,你应该就能连接到对应的接口,后台接口可以使用debug看看
	//然后是对于请求返回的接收
	if (connection.getResponseCode() == 200){
		//使用字符流形式进行回复
		InputStream is = connection.getInputStream();
		//读取信息BufferReader
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuffer buffer = new StringBuffer();
		String readLine = "";
		while ((readLine = reader.readLine()) != null) {
				buffer.append(readLine);
		}
		is.close();
		reader.close();
		connection.disconnect();
	}
}
catch (Exception e) {
       e.printStackTrace();
}

//POST请求

String getUrl = "";
String reqJsonString = "";//传入参数
try{
	URL url = new URL(getUrl);
	HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	// 设置POST请求
	connection.setRequestMethod("POST");
	//缺少此项可能会出现请求失败的情况
	connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
	// 设置可向服务器输出
	connection.setConnectTimeout(5000);//超时设定
	connection.setDoOutput(true);
	connection.setDoInput(true);
	connection.setUseCaches(false);
	// 打开连接
	//connection.connect();
	// 打开连接后,向服务端写要提交的参数
	StringBuilder stringBuilder = new StringBuilder();
	stringBuilder.append(reqJsonString);
	// 获取向服务器写数据的输出流
	connection.getOutputStream().write(reqJsonString.getBytes());
	connection.getOutputStream().flush();
	connection.getOutputStream().close();
	//至此,就可以通过后台进行debug验证是否成功请求了
	// 提交数据后,获取来自服务器的json数据
	if (connection.getResponseCode() == 200) {
		//使用字符流形式进行回复
		InputStream is = connection.getInputStream();
		//读取信息BufferReader
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuffer buffer = new StringBuffer();
		String readLine = "";
		while ((readLine = reader.readLine()) != null) {
			buffer.append(readLine);
		}
		is.close();
		reader.close();
		connection.disconnect();
	}
}
catch (Exception e) {
	e.printStackTrace();
}

返回的内容将存储于readLine中,然后根据自己所需的逻辑再进行处理。

问题

这里不得不提到一个问题——Android之NetworkOnMainThreadException异常
当使用的Android为3.0以上的版本时,那么你就会遇到该异常。

解决办法可以参考该博客

https://blog.csdn.net/baidu_35975930/article/details/79765522

异常的原因,楼主也记得不是很清楚,大概就是android高版本更加注重安全性问题,所有不允许直接在当前的主线程中发送http请求。所以解决办法也很简单,就是创建一个子线程,在子线程中进行模拟发送http请求。然后子线程再通过Handler的机制于主线程发生通信即可。

//子线程
Message msg = mHandler.obtainMessage(1);//1:消息标识
Bundle data = new Bundle();
data.putString("result", "1");//需要传递的参数
msg.setData(data);
mHandler.sendMessage(msg);//发送
//主线程
private Handler mHandler = new Handler(){
    public void handleMessage(Message msg) {
        Bundle bundle = msg.getData();//获取残敌过来的参数(result: "1")
        if (bundle == null) return;
        switch (msg.what) {
            case 1:		//此处的1为子线程发过来的消息标识
                //主线程中需要执行的后续操作
                break;
            default:
                break;
        }
    }
};

参考文章:
java模拟http请求调用远程接口工具类

https://www.cnblogs.com/vitre/p/5474166.html

-明天又会是怎么样呢?

你可能感兴趣的:(学习整理,Android,studio,htpp请求)