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;
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;
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{
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。
|