• (AS笔记)Android的原生网络请求工具类——亲测可用


    目录

    一、前言

    二、后端

    三、Android端

            (1)HTTP限制访问

                    ——network_security_config.xml

                    ——AndroidManifest.xml

            (2)XML页面布局

            (3)HttpURLConnection工具类代码

            (4)MainActivity代码

    四、效果测试

    五、总结


    一、前言

            公司要求使用原生方式请求后端API接口(SpringBoot),在此做个记录。


    二、后端

            使用Mybatis-Plus查询MySQL单条数据,返回JSON格式到Android端。后端Controller代码如下:

    1. @ResponseBody
    2. @PostMapping(value = "/patch")
    3. public AdConfigBean selectConfigByPkgName(@RequestParam("gkpn") String pkgName) {
    4. return adconfigService.getOne(new QueryWrapper()
    5. .select("*")
    6. .eq("pkg_name", pkgName), false);
    7. }

    三、Android端

            (1)HTTP限制访问

            Android对HTTP协议的请求已经不支持了,需要进行放行配置。先创建XML,再到AndroidManifest.xml配置文件中引用。

                    ——network_security_config.xml

    1. <network-security-config>
    2. <base-config cleartextTrafficPermitted="true"/>
    3. network-security-config>

                    ——AndroidManifest.xml

    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. package="com.example.demo">
    4. <uses-permission android:name="android.permission.INTERNET"/>
    5. <application
    6. android:usesCleartextTraffic="true"
    7. android:networkSecurityConfig="@xml/network_security_config"
    8. android:allowBackup="true"
    9. android:icon="@mipmap/ic_launcher"
    10. android:label="@string/app_name"
    11. android:roundIcon="@mipmap/ic_launcher_round"
    12. android:supportsRtl="true"
    13. android:theme="@style/Theme.Demo"
    14. tools:targetApi="n">
    15. <activity
    16. android:name=".MainActivity"
    17. android:exported="true">
    18. <intent-filter>
    19. <action android:name="android.intent.action.MAIN" />
    20. <category android:name="android.intent.category.LAUNCHER" />
    21. intent-filter>
    22. activity>
    23. application>
    24. manifest>

            (2)XML页面布局

            布局为两个控件,单击按钮,请求成功,文本框展示后端返回的JSON数据。

    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. tools:context=".MainActivity">
    6. <TextView
    7. android:id="@+id/tv_show"
    8. android:layout_width="match_parent"
    9. android:layout_height="wrap_content"
    10. android:layout_centerHorizontal="true" />
    11. <Button
    12. android:text="发送POST"
    13. android:id="@+id/btn_sendPost"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:layout_centerInParent="true" />
    17. RelativeLayout>

            (3)HttpURLConnection工具类代码

    1. public class NetworkUtil {
    2. public static String doGet(String urlPath) {
    3. try {
    4. HttpURLConnection conn = (HttpURLConnection) new URL(urlPath).openConnection();
    5. conn.setRequestMethod("GET");
    6. if (200 == conn.getResponseCode()) {
    7. return new BufferedReader(new InputStreamReader(conn.getInputStream())).readLine();
    8. }
    9. } catch (Exception e) {
    10. e.printStackTrace();
    11. }
    12. return "{ \"success\": false,\n \"errorMsg\": \"后台服务器开小差了!\",\n \"result\":{}}";
    13. }
    14. public static String doPost(String urlPath, HashMap paramsMap) {
    15. try {
    16. HttpURLConnection conn = (HttpURLConnection) new URL(urlPath).openConnection();
    17. conn.setRequestMethod("POST");
    18. conn.setDoOutput(true);
    19. StringBuilder result = new StringBuilder();
    20. for (HashMap.Entry entity : paramsMap.entrySet()) {
    21. result.append("&").append(entity.getKey()).append("=").append(entity.getValue());
    22. }
    23. conn.getOutputStream().write(result.substring(1).getBytes());
    24. if (200 == conn.getResponseCode()) {
    25. return new BufferedReader(new InputStreamReader(conn.getInputStream())).readLine();
    26. }
    27. } catch (Exception e) {
    28. e.printStackTrace();
    29. }
    30. return "{ \"success\": false,\n \"errorMsg\": \"后台服务器开小差了!\",\n \"result\":{}}";
    31. }
    32. }

            (4)MainActivity代码

    1. public class MainActivity extends AppCompatActivity {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.activity_main);
    6. initView();
    7. }
    8. private void initView() {
    9. TextView tvShow = findViewById(R.id.tv_show);
    10. Button btnSendPost = findViewById(R.id.btn_sendPost);
    11. btnSendPost.setOnClickListener(new View.OnClickListener() {
    12. @Override
    13. public void onClick(View view) {
    14. HashMap paramsMap = new HashMap<>();
    15. paramsMap.put("gkpn", "com.time.hxzbyx.meta");
    16. new Thread(new Runnable() {
    17. @Override
    18. public void run() {
    19. String resultJson = NetworkUtil.doPost("http://www.wugua.com.cn/patch", paramsMap);
    20. runOnUiThread(new Runnable() {
    21. @Override
    22. public void run() {
    23. tvShow.setText(resultJson);
    24. Log.i("resultJson", resultJson);
    25. }
    26. });
    27. }
    28. }).start();
    29. }
    30. });
    31. }
    32. }

    四、效果测试


    五、总结

    仅自己学习记录,如有错误,敬请谅解~,谢谢~~~

  • 相关阅读:
    ipv6进行ping6测试报错connect: Invalid argument解决方法
    易云维®医院后勤管理系统软件利用物联网智能网关帮助实现医院设备实现智能化、信息化管理
    Hexo自定义修改文章访问地址
    如何选择和设计微服务网关
    FreeSWITCH windows编译
    vmware ubuntu 操作
    8分钟,复习一遍红黑树
    【珠峰 WEB 前端架构师课程】学习笔记 100 篇(完结)
    WinRT: 可能是 Windows 上最好用的 Native ABI 和远程调用方案
    数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)
  • 原文地址:https://blog.csdn.net/qq_39038178/article/details/126232326