IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Qt for Android之POST/GET方法 -> 正文阅读

[移动开发]Qt for Android之POST/GET方法

写作原因

在Qt中,发送POST/GET请求,如果用C++的话,比较简单,QNetWorkAccessManager结合QNetWorkRequest就可以了。但是Qt作为一个跨平台开发的工具,对于POST/GET在Android上的支持却不是很好,同样的代码,在Windows平台上可以发送,也可以接收返回的数据。但切换到Android上接收到的信息却是空,也不能确定是不是发送出去了:

在这里插入图片描述
那如果C++在Android上不行,直接用QML呢?QML提供了一个XMLHttpRequest,使用链接中的例子,同样的,在Windows下可以发送接收,但切换到Android中接收也是空_!!

function request() {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
            print('HEADERS_RECEIVED');
        } else if(xhr.readyState === XMLHttpRequest.DONE) {
            print('DONE');
        }
    }
    xhr.open("GET", "http://example.com");
    xhr.send();
}

诸位看官自行试一下吧,很失望。。。 。。。

解决

如果Qt不行,那么Android Studio可不可以实现呢?安卓GET与POST网络请求的三种方式如何使用Android Studio发送一个简单的GET/POST网络请求,不得不说,Android Studio才是亲儿子。

JAVA实现Qt for Android POST/GET方法

新建一个Qt项目,添加AndroidMenafest.xml文件,笔者的包名是默认的org.qtproject.example,在项目的android文件下新建src文件夹,依次新建org->qtproject->example文件夹,在这个example文件夹下新建MainAcitivity.java文件,并添加进项目中:
在这里插入图片描述

Android Studio中的代码

package com.example.ptest;
import androidx.appcompat.app.AppCompatActivity;//注1
import android.os.Bundle;
import android.util.Log;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(){
            @Override
            public void run(){
                networkRequest();
            }
        }.start();
    }
    private void networkRequest(){
        HttpURLConnection connection = null;
        try {
            URL url = new URL("请求的地址");
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setDoOutput(true);
            OutputStream os = connection.getOutputStream();
            String param = "请求的参数";
            os.write(param.getBytes(StandardCharsets.UTF_8));
            os.flush();
            InputStream is = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null){
                sb.append(line);
            }
            Log.d("输出:", sb.toString());
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

这段代码在Android Studio中可以运行,把请求的地址和参数换成自己的,可以获得返回的信息。
PS:添加权限
PS:这里有个注1,留意一下。

Qt中JAVA的代码

package org.qtproject.example;
import org.qtproject.qt5.android.bindings.QtActivity;//注2

import android.os.Bundle;
import android.util.Log;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity{//注3

    private static MainActivity activity;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activity = MainActivity.this;
        new Thread(){
                    @Override
                    public void run(){
                        networkRequest();
                    }
                }.start();
    }
private void networkRequest() {
    HttpURLConnection connection = null;
    try {
        URL url = new URL("");
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        connection.setDoOutput(true);
        OutputStream os = connection.getOutputStream();
        String param = "";
        os.write(param.getBytes(StandardCharsets.UTF_8));
        os.flush();
        InputStream is = connection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null){
            sb.append(line);
        }
        Log.d("输出:", sb.toString());
    } catch (Exception e){
        e.printStackTrace();
    }
}
}

这里的代码和Android Studio中的一样,不一样的是MainActivity这个类,如果直接用AndroidStudio中的androidx.appcompat.app.AppCompatActivity,Qt会报错,所以这里扩展用 org.qtproject.qt5.android.bindings.QtActivity。笔者这里用的Qt 5.15版本,如果是Qt 6,这里也不一样。
然后,AndroidManifest.xml也需要修改,
在这里插入图片描述
android:name后面替换为我们自己的MainActivity,原来的是org.qtproject.qt5.android.bindings.QtActivity。

运行之后,有结果了:
在这里插入图片描述

返回的结果

在JAVA文件中返回的信息如何处理,如何返回到C++中,参考笔者的Qt for Android之QJniObject

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:13:15  更:2022-04-01 00:13:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:28:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码