首先我们在安卓里面发送网络请求,就要添加网络权限
在安卓的manifest文件里面添加权限

还有就是要知道 安卓开发的两大原则 :

  1. 只能在主线程里面进行UI操作
  2. 在子线程里面进行耗时操作(网络请求/传输文件等)

1 HttpURLConnection发送http请求

界面:
我们创建一个按钮,和一个 TextView
点击按钮发送http请求,将服务器返回来的数据,放到文件TextView里面。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:orientation="vertical"
  7. android:layout_height="match_parent"
  8. tools:context=".MainActivity">
  9. <Button
  10. android:id="@+id/Send_request"
  11. android:layout_width="match_parent"
  12. android:layout_height="50dp"
  13. android:text="http请求"
  14. />
  15. <ScrollView
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent">
  18. <TextView
  19. android:id="@+id/ResponseText"
  20. android:layout_width="match_parent"
  21. android:layout_height="wrap_content"/>
  22. </ScrollView>
  23. </LinearLayout>

1.1 发送get请求

后端程序

  1. public class MainActivity extends AppCompatActivity {
  2. private Button bt;
  3. private TextView showResp;
  4. private String RESPONSE_MSG ;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. //textView
  10. showResp = findViewById(R.id.ResponseText);
  11. bt = findViewById(R.id.Send_request);
  12. bt.setOnClickListener(new View.OnClickListener() {
  13. @Override
  14. public void onClick(View view) {
  15. //点击以后发送http请求
  16. // Toast.makeText(MainActivity.this, "rrrrr", Toast.LENGTH_SHORT).show();
  17. sendRequestWithHttpUrlConnection();
  18. }
  19. });
  20. }
  21. /**
  22. * 使用 httpUrlConnection这对象
  23. * 发送http请求的一个方法 ,网络请求等一些耗时一定要放到 子线程里面进行
  24. */
  25. private void sendRequestWithHttpUrlConnection() {
  26. //开启线程发送网络请求
  27. new Thread(new Runnable() {
  28. @Override
  29. public void run() {
  30. HttpURLConnection connection = null;
  31. BufferedReader reader = null;
  32. try {
  33. //这里你可以设置为www.baidu.com 试试
  34. URL url = new URL("https://open.iot.10086.cn/studio/debug/api/application?version=1&action=QueryDeviceProperty&project_id=ZIVS7i&product_id=FkWRPqXmGF&device_name=CWBW_02");//这里还是要使用https
  35. connection = (HttpURLConnection) url.openConnection();
  36. //设置请求方法 POST 或者GET
  37. connection.setRequestMethod("GET");
  38. //在请求头里面设置数据 请求的同时将 这个键值对发送给服务器
  39. connection.setRequestProperty("Authorization","version=2020-05-29&res=userid%2F274573&et=1680617906&method=sha1&sign=aJq4RknOXahqFwgPvZUOYAg8cH4%3D");
  40. //设置连接超时时间
  41. connection.setConnectTimeout(8000); //ms
  42. //设置读取超时时间
  43. connection.setReadTimeout(8000);
  44. //获得输入流, 读取服务器返回来的数据
  45. InputStream in = connection.getInputStream();
  46. //输入流转为 高效流
  47. reader = new BufferedReader(new InputStreamReader(in));
  48. //转为字符
  49. StringBuilder reaponse = new StringBuilder();
  50. String line;
  51. while ((line = reader.readLine()) != null) {
  52. reaponse.append(line);
  53. }
  54. //给textvie设置数据
  55. RESPONSE_MSG = reaponse.toString() ;
  56. showResponse(RESPONSE_MSG);
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. } finally {
  60. //不管是否出现异常都释放资源
  61. if (reader != null) {
  62. try {
  63. reader.close();
  64. } catch (IOException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. if (connection != null) {
  69. connection.disconnect();
  70. }
  71. }
  72. }
  73. }).start(); //开启线程
  74. }
  75. //显示到textView 里面 ,但是现在是在子线程里面,不能在子线程里面更新UI 所以我们要转到UI线程
  76. private void showResponse(final String reaponse){
  77. runOnUiThread(new Runnable() {
  78. @Override
  79. public void run () {
  80. showResp.setText(reaponse);
  81. }
  82. });
  83. }
  84. }


image.png 效果图

1.2 发送post请求

其实学习计算机的我们知道 请求网络的方法 有6 7 种的但是最长使用的就是 post和get请求。

二者的区别就是,get方法在向服务器传递数据的时候是用明文显示的,可以直接将参数放到 url里面。
就像是上面这样
从 ? 开始添加参数,不同的参数之间用&符号连接
https://open.iot.10086.cn/studio/debug/api/application?version=1&action=QueryDeviceProperty

post在想服务器发送数据的时候是不能将数据放到url里面的。
安卓里面提交数据给服务器的时候,将http里面将请求方法改为 post, 并且在获取输入流之前将数据给写入就可以了。数据与数据之间也是用&符号连接。

  1. connection.setRequestMethod("POST");
  2. DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
  3. outputStream.writeBytes("username=admine&password=123456");
  4. //获得输入流, 读取服务器返回来的数据
  5. InputStream in = connection.getInputStream();
  6. //输入流转为 高效流
  7. reader = new BufferedReader(new InputStreamReader(in));
  8. //转为字符
  9. StringBuilder reaponse = new StringBuilder();
  10. while ((line = reader.readLine()) != null) {
  11. reaponse.append(line);
  12. }
  13. //给textvie设置数据
  14. RESPONSE_MSG = reaponse.toString() ;

2 OKHttp发送http请求

使用 OKHttp对象首先我们要先在app:gradle 里面添加Okhttp的包

implementation ‘com.squareup.okhttp3:okhttp:3.4.1’

2.1 发送get请求

前面的话

首先我们要创建一个OkHttpClient的对象
OkHttpClient client = new OkHttpClient();

如果我们想发送一个http请求要 创建一个 请求对象 Request对象
Request request = new Request.Builder().build();

当然现在这个对象是空的,我们要在他build之前丰富这个对象,比如说要设置目标网络的地址
Request request = new Request.Builder()//创建请求
.url(“https://www.baidu.com“)
.build();

我们还可以给这个请求添加请求头
Request request = new Request.Builder()//创建请求
.url(“https://www.baidu.com“)
.header(“键的名字”,”值”)
.build();

然后调起客户端对象,给请求的网址“打电话call“,获取服务器的数据
Response response = okHttpClient.newCall(request).execute();

response就是服务器返回来的数据,要把他转为字符串
String responsedata = response.body().string();

代码的实现
前端界面代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:orientation="vertical"
  7. android:layout_height="match_parent"
  8. tools:context=".MainActivity">
  9. <Button
  10. android:id="@+id/Send_Http"
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. android:text="使用OKHttp发送http请求"/>
  14. <ScrollView
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent">
  17. <TextView
  18. android:id="@+id/ResponseText"
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content"/>
  21. </ScrollView>
  22. </LinearLayout>

活动的代码

  1. public class MainActivity2 extends AppCompatActivity {
  2. private TextView textView ;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main2);
  7. //我们要使用过OKHttp首先就是要 在app.gradle里面引入一个包 implementation 'com.squareup.okhttp3:okhttp:3.4.1'
  8. textView = findViewById(R.id.ResponseText);
  9. Button sendOKHTTP = findViewById(R.id.Send_Http);
  10. sendOKHTTP.setOnClickListener(new View.OnClickListener() {
  11. @Override
  12. public void onClick(View view) {
  13. sendHttpWithOKHttp();
  14. }
  15. });
  16. }
  17. //发送http请求的方法
  18. private void sendHttpWithOKHttp(){
  19. //网络请求放在一个新的线程里面 只能在子线程里面发送网络请求
  20. new Thread(new Runnable() {
  21. @Override
  22. public void run() {
  23. //得到Okhttp对象
  24. OkHttpClient client = new OkHttpClient();
  25. //创建请求对象
  26. Request request = new Request.Builder()
  27. .url("https://open.iot.10086.cn/studio/debug/api/application?version=1&action=QueryDeviceProperty&project_id=ZIVS7i&product_id=FkWRPqXmGF&device_name=CWBW_02")
  28. .header("authorization","version=2020-05-29&res=userid%2F274573&et=1680617906&method=sha1&sign=aJq4RknOXahqFwgPvZUOYAg8cH4%3D")
  29. .build();
  30. // 调用客户端,给服务器”打电话“ 接收服务器返回来的数据
  31. String resp = "" ;
  32. try {
  33. Response response = client.newCall(request).execute();
  34. //回来的数据转为字符串
  35. resp = response.body().string();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. //只能在主线程里面更新UI
  40. String finalResp = resp;
  41. runOnUiThread(new Runnable() {
  42. @Override
  43. public void run() {
  44. textView.setText(finalResp);
  45. }
  46. });
  47. }
  48. }).start();
  49. }
  50. }

效果展示
image.png

2.2 发送POST请求

如果想发送一个post请求。我们要先构建一个RequestBody对象来存放待提交的数据。

  1. RequestBody requestBody = new FormBody.Builder()
  2. .add("name","admine")
  3. .add("password","123456")
  4. .build();
  5. //然后在request.builder里面调用一下post
  6. Request request1 = new Request.Builder()
  7. .url("https://www.baidu.com")
  8. .post(requestBody)
  9. .build();
  10. //最后调用 OkHttpClient 对象给 url地址打电话 得到服务器返回的对象
  11. Response response2 = client.newCall(request1).execute();
  12. //报异常的话 try catch 一下就可以了

如下图所示

访问https://www.baidu.com
完整代码

  1. public class MainActivity2 extends AppCompatActivity {
  2. private TextView textView ;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main2);
  7. //我们要使用过OKHttp首先就是要 在app.gradle里面引入一个包 implementation 'com.squareup.okhttp3:okhttp:3.4.1'
  8. textView = findViewById(R.id.ResponseText);
  9. Button sendOKHTTP = findViewById(R.id.Send_Http);
  10. sendOKHTTP.setOnClickListener(new View.OnClickListener() {
  11. @Override
  12. public void onClick(View view) {
  13. sendHttpWithOKHttp();
  14. }
  15. });
  16. }
  17. //发送http请求的方法
  18. private void sendHttpWithOKHttp(){
  19. //网络请求放在一个新的线程里面 只能在子线程里面发送网络请求
  20. new Thread(new Runnable() {
  21. @Override
  22. public void run() {
  23. //得到Okhttp对象
  24. OkHttpClient client = new OkHttpClient();
  25. // //创建请求对象
  26. // Request request = new Request.Builder()
  27. // .url("https://open.iot.10086.cn/studio/debug/api/application?version=1&action=QueryDeviceProperty&project_id=ZIVS7i&product_id=FkWRPqXmGF&device_name=CWBW_02")
  28. // .header("authorization","version=2020-05-29&res=userid%2F274573&et=1680617906&method=sha1&sign=aJq4RknOXahqFwgPvZUOYAg8cH4%3D")
  29. // .build();
  30. //使用post方式提交请求 并且携带参数
  31. RequestBody requestBody = new FormBody.Builder()
  32. .add("name","admine")
  33. .add("password","123456")
  34. .build();
  35. //然后在request.builder里面调用一下post
  36. Request request1 = new Request.Builder()
  37. .url("https://www.baidu.com")
  38. .post(requestBody)
  39. .build();
  40. //最后调用 OkHttpClient 对象给 url地址打电话 得到服务器返回的对象
  41. //Response response2 = client.newCall(request1).execute(); //报异常的话 try catch 一下就可以了
  42. // 调用客户端,给服务器”打电话“ 接收服务器返回来的数据
  43. String resp = "" ;
  44. try {
  45. Response response = client.newCall(request1).execute();
  46. //回来的数据转为字符串
  47. resp = response.body().string();
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }
  51. String finalResp = resp;
  52. runOnUiThread(new Runnable() {
  53. @Override
  54. public void run() {
  55. textView.setText(finalResp);
  56. }
  57. });
  58. }
  59. }).start();
  60. }
  61. }

效果展示
image.png 这个就是访问百度返回来的一写数据

3 自己的思考

我们访问百度的网址可以得到数据的返回,我是学习后端的,我使用我的安卓代码,是不是就也可以发访问我本地的tomcat里面的web项目了呢??

因为tomcat里面的项目肯定是 局域网里面的项目,所以我们肯低要和tocmat在同一个局域网里面才可以得到tomcat里面的数据。。。