Отправить форму с данными POST в приложении Android - PullRequest
4 голосов
/ 08 июня 2010

Я искал в интернете способ сделать это около недели, и я просто не могу понять это.

Я пытаюсь реализовать приложение, которое мой колледж может использовать, чтобы пользователи могли легко входить в различные службы в кампусе. В настоящее время это работает так: они заходят на онлайн-портал, выбирают, какую услугу они хотят, вводят свои имя пользователя и pwd и нажимают кнопку «Войти». Данные формы отправляются по почте (включает несколько скрытых значений, а также только имя пользователя и pwd) в соответствующий сценарий входа, который затем регистрирует их и загружает службу.

Я пытался решить проблему двумя способами. Сначала я попробовал WebView, но, похоже, он не хочет поддерживать все HTML, которые обычно заставляют эту форму работать. Я получаю все необходимые мне элементы, поля для пользователя и pwd, а также кнопку входа, но нажатие на кнопку ничего не делает. Я задавался вопросом, нужно ли мне добавить обработчик onclick для него, но я не вижу, как кнопка реализована в html веб-просмотра, не используя отдельный элемент android.

Другой возможностью было использование виджетов xml для создания формы с хорошим относительным макетом, который, кажется, загружается быстрее и выглядит лучше на экране Android. Я использовал поля EditText для ввода, виджет счетчика для выбора службы и виджет кнопки для входа в систему. Я знаю, как настроить обработчики onclick и item для кнопки и счетчика, соответственно, но я не могу понять, как отправить эти данные через POST, чтобы запустить браузер. Я могу выполнить намерение с помощью URL-адреса действия, но не могу получить данные POST для подачи в него.

Итак, вот что у меня сейчас ...

HttpParams params = new BasicHttpParams();
HttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost(action);
String endResult = null;

try 
{
post.setEntity(new UrlEncodedFormEntity(myList));
} 
catch (UnsupportedEncodingException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
} 

try 
{
String response = client.execute(post, new BasicResponseHandler());
endResult = response;
} 
catch (ClientProtocolException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
} 
catch (IOException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
}  

Так что мой вопрос сейчас ... как мне взять экран endResult, который должен быть страницей, возвращаемой после того, как я вошел в свой сервис, и отобразить ее в браузере?

Ответы [ 2 ]

4 голосов
/ 08 июня 2010

Что с ними не так, просто используя встроенный браузер? Вы также можете отправить форму, используя UrlEncodedFormEntity и HttpClient.

HttpParams params = new DefaultHttpParams(); // setup whatever params you what
HttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost("someurl");
post.setEntity(new UrlEncodedFormEntity()); // with list of key-value pairs
client.execute(post, new ResponseHandler(){}); // implement ResponseHandler to handle response correctly.

Хорошо, и после того, как у вас есть ответ в строке. Ответ, поскольку его страница будет в HTML. Вам нужно использовать WebView, чтобы показать HTML. В WebView есть метод loadData (), который принимает строку html и отображает ее.

1 голос
/ 30 января 2014

Основываясь на ответе @RobbyPonds, для удобства людей, проходящих мимо здесь, ниже приведена общая реализация для отправки и получения ответа от URI ( NOTE Также содержит ожидающую реализацию для возврата ответа, вероятно,не каждый день реализация сетевого вызова):

private static String responseValue;

@SuppressWarnings({ "unchecked", "rawtypes" })  
public static String sendPostToTargetAndWaitForResponse() throws ClientProtocolException, IOException {     
    final Thread currentThread = Thread.currentThread();
    synchronized (currentThread) {      

        HttpParams params = new BasicHttpParams();
        HttpClient client = new DefaultHttpClient(params);
        HttpPost post = new HttpPost(HTTP_POST_URI);

        // List Creation with post data for UrlEncodedFormEntity
        ArrayList<NameValuePair> mList = new ArrayList<NameValuePair>();
        mList.add(new NameValuePair() {

            @Override
            public String getValue() {
                return getSampleJSON();
            }

            @Override
            public String getName() {
                return "json";
            }
        });
        post.setEntity(new UrlEncodedFormEntity(mList)); // with list of key-value pairs
        client.execute(post, new ResponseHandler(){

            @Override
            public Object handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
                responseValue = EntityUtils.toString(response.getEntity(), "UTF-8");
                synchronized (currentThread) {                          
                    currentThread.notify();
                }
                return null;
            }
        }); 
        try {
            currentThread.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return responseValue;
    } 
}
...