使用 Jsoup 提交在 Android 中有 select 个输入的表单
Using Jsoup to submit a form that has select inputs in Android
大家好,我是 Android 应用程序开发的新手。我目前正在尝试开发一个应用程序来显示两个地方的路线,我发现来自 https://mrt.sg/fare 的数据对我来说非常有用。该页面的表单包含两个 select 类型的输入和一个提交按钮。我尝试使用Jsoup填写并提交表单并得到结果,但我做不到。这是我的代码。
谁能帮我?谢谢!
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Content content = new Content();
content.execute();
}
private class Content extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
@Override
protected void onCancelled(Void aVoid) {
super.onCancelled(aVoid);
}
@Override
protected Void doInBackground(Void... voids) {
try{
/*
Document doc = Jsoup.connect("https://mrt.sg/fare").get();
Elements options = doc.select("select#stn_a>option");
for (Element option : options) {
System.out.println("label: " + option.text() + ", value: " + option.attr("value"));
}
Log.d("","doc: " +doc);
*/
Connection.Response res = Jsoup.connect("https://mrt.sg/fare")
.data("stn_a", "hj").data("stn_b", "zl").method(Connection.Method.POST).execute();
Document doc = res.parse();
String data = doc.select("div#results_tripcalc").text();
Log.d("Result","result: " +data);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
}
您必须完全按照网络浏览器提交的方式发送数据。
为了检查实际发送的内容,我使用了 Chrome 的调试器并打开了网络选项卡。然后我填写表格并单击“计算票价”。现在调试器显示 POST 已发送到 URL:https://mrt.sg/tripcalc
并且参数为:
station_a: id
station_b: bv
我调整了你的代码来做到这一点并且它工作正常:
Connection.Response res = Jsoup.connect("https://mrt.sg/tripcalc")
.data("station_a", "hj")
.data("station_b", "zl")
.method(Connection.Method.POST)
.execute();
大家好,我是 Android 应用程序开发的新手。我目前正在尝试开发一个应用程序来显示两个地方的路线,我发现来自 https://mrt.sg/fare 的数据对我来说非常有用。该页面的表单包含两个 select 类型的输入和一个提交按钮。我尝试使用Jsoup填写并提交表单并得到结果,但我做不到。这是我的代码。 谁能帮我?谢谢!
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Content content = new Content();
content.execute();
}
private class Content extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
@Override
protected void onCancelled(Void aVoid) {
super.onCancelled(aVoid);
}
@Override
protected Void doInBackground(Void... voids) {
try{
/*
Document doc = Jsoup.connect("https://mrt.sg/fare").get();
Elements options = doc.select("select#stn_a>option");
for (Element option : options) {
System.out.println("label: " + option.text() + ", value: " + option.attr("value"));
}
Log.d("","doc: " +doc);
*/
Connection.Response res = Jsoup.connect("https://mrt.sg/fare")
.data("stn_a", "hj").data("stn_b", "zl").method(Connection.Method.POST).execute();
Document doc = res.parse();
String data = doc.select("div#results_tripcalc").text();
Log.d("Result","result: " +data);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
}
您必须完全按照网络浏览器提交的方式发送数据。
为了检查实际发送的内容,我使用了 Chrome 的调试器并打开了网络选项卡。然后我填写表格并单击“计算票价”。现在调试器显示 POST 已发送到 URL:https://mrt.sg/tripcalc
并且参数为:
station_a: id
station_b: bv
我调整了你的代码来做到这一点并且它工作正常:
Connection.Response res = Jsoup.connect("https://mrt.sg/tripcalc")
.data("station_a", "hj")
.data("station_b", "zl")
.method(Connection.Method.POST)
.execute();