Использование Jsoup для отправки формы, которая имеет входные данные для выбора в Android - PullRequest
0 голосов
/ 01 августа 2020

Привет, ребята, я новичок в разработке приложений Android. В настоящее время я пытаюсь разработать приложение, которое показывает маршрут из двух мест, и я обнаружил, что данные из https://mrt.sg/fare весьма полезны для меня. Форма страницы содержит два ввода типа выбора и кнопку отправки. Я пытался использовать 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;
    }
}
}

1 Ответ

1 голос
/ 02 августа 2020

Вы должны отправлять свои данные точно так, как их отправляет ваш веб-браузер. Чтобы проверить, что действительно отправлено, я использовал отладчик 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();
...