Как отправить переменные из Android Activity на URL-адрес веб-сайта?

У меня есть приложение, которое работает как форма, оно принимает четыре поля и проверяет информацию, чтобы убедиться, что не введены недопустимые символы. Эти четыре поля хранятся в переменных:

  • Телефон
  • Имя
  • Электронное письмо
  • Комментарии

    Теперь я хочу отправить данные формы (все, что введено в эти четыре поля и сохранено в переменных) на URL-адрес (будет использовать http://www.test.com), но я не знаю, как это сделать. Я думаю, что ищу что-то под названием HttpURLConnection, но я не уверен, как указать, какая переменная отправляется. Приведенный ниже код я нашел на веб-сайте http://developer.android.com/reference/java/net/HttpURLConnection.html

    private class UploadFilesTask extends AsyncTask<URL, Integer, Long>{
    protected Long doInBackground(URL... urls) {
    
        try {
            HttpClient http = new DefaultHttpClient();
            HttpPost post = new HttpPost("http://www.test.com");
    
            List<NameValuePair> data = new ArrayList<NameValuePair>();
            data.add(new BasicNameValuePair("phone", "value"));
            data.add(new BasicNameValuePair("name", "value"));
            data.add(new BasicNameValuePair("email", "value"));
            data.add(new BasicNameValuePair("comments", "value"));
            post.setEntity(new UrlEncodedFormEntity(data));
    
            HttpResponse response = http.execute(post);
            // do something with the response
        }
        catch (ClientProtocolException e) {
            // do something
            finish();
        }
        catch (IOException e) {
            // do something
            finish();
        }
    

    }

    }

Любая помощь будет высоко оценена, спасибо!


person tehman    schedule 23.07.2012    source источник
comment
Принимает ли веб-сайт значение в паре Параметр-значение, я имею в виду переписывание URL?   -  person Chintan Raghwani    schedule 23.07.2012
comment
Что ожидает сервер? POST-запрос? Запрос GET с параметрами в строке запроса?   -  person sdabet    schedule 23.07.2012
comment
Я считаю, что сервер ожидает POST-запрос   -  person tehman    schedule 23.07.2012


Ответы (4)


Самый простой способ отправить данные формы на сервер — использовать HttpClient и HttpPost.

Попробуйте что-то вроде этого:

try {
    HttpClient http = new DefaultHttpClient();
    HttpPost   post = new HttpPost("http://www.example.com/process");

    List<NameValuePair> data = new ArrayList<NameValuePair>();
    data.add(new BasicNameValuePair("phone", "value");
    data.add(new BasicNameValuePair("name", "value");
    data.add(new BasicNameValuePair("email", "value");
    data.add(new BasicNameValuePair("comments", "value");
    post.setEntity(new UrlEncodedFormEntity(data));

    HttpResponse response = http.execute(post);
    // do something with the response
}
catch (ClientProtocolException e) {
    // do something
}
catch (IOException e) {
    // do something
}

Обратите внимание, что вы захотите выполнить эту операцию в AsyncTask, чтобы не блокировать поток пользовательского интерфейса в ожидании завершения сетевых операций.

Изменить

Вот простой быстрый пример того, как это может выглядеть в AsyncTask.

public class SendTask extends AsyncTask<Void, Void, Boolean> {

    String responseString;

    @Override
    protected Boolean doInBackground(Void... params) {
        try {

            HttpClient http = new DefaultHttpClient();
            HttpPost post = new HttpPost("http://www.test.com");

            List<NameValuePair> data = new ArrayList<NameValuePair>();
            data.add(new BasicNameValuePair("phone", "value"));
            data.add(new BasicNameValuePair("name", "value"));
            data.add(new BasicNameValuePair("email", "value"));
            data.add(new BasicNameValuePair("comments", "value"));
            post.setEntity(new UrlEncodedFormEntity(data));

            HttpResponse response = http.execute(post);
            responseString = new BasicResponseHandler().
                                 handleResponse(response); // Basic handler
            return true;
        }
        catch (ClientProtocolException e) {
            // do something useful to recover from the exception
            // Note: there may not be anything useful to do here
        }
        catch (IOException e) {
            // do something useful to recover from the exception
            // Note: there may not be anything useful to do here
        }           
        return false;
    }
    @Override
    protected void onPostExecute(Boolean success) {
        // TODO: Do something more useful here
        if (success) {
            Toast.makeText(MainActivity.this, "Success: " + responseString, Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_LONG).show();
        }
    }
}
person nEx.Software    schedule 23.07.2012
comment
Хороший, простой пример. Хотя следует упомянуть, что обычно вы должны использовать ResponseHandler для обработки HTTP-ответов — это гарантирует, что объект всегда будет потребляться, а соединение будет правильно разорвано. - person Joseph Earl; 23.07.2012
comment
@nEx.Software спасибо за ваш пример, это определенно проясняет некоторые вещи. Но у меня есть несколько вопросов: что делают два оператора catch и как вы выполняете эту операцию в AsyncTask? Я просто расширяю AsyncTask в классе, где я это использую? - person tehman; 23.07.2012
comment
Два оператора catch необходимы, так как HttpClient.execute(...) может генерировать эти исключения. Я сомневаюсь, что вы когда-либо сталкивались с ClientProtocolException, но вы можете столкнуться с IOException, если соединение не может быть установлено. Что касается использования AsyncTask с этим, создайте внутренний класс (или даже анонимный класс), который расширяет AsyncTask, и используйте метод, описанный выше, в методе doInBackground. - person nEx.Software; 23.07.2012
comment
@nEx.Software Я обновил свой код выше, но я не думаю, что он у меня еще есть. Можете ли вы помочь мне с тем, что, по вашему мнению, не так с кодом выше? Спасибо - person tehman; 23.07.2012
comment
Ну, это зависит. Единственное, что я считаю технически неверным в новом коде, — это вызов finish() в catch. Вы также можете изменить его на extends AsyncTask<Void, Void, Void> {, если вы не отправляете какие-либо параметры, не обновляете ход выполнения или не возвращаете какие-либо результаты. Я добавил один пример того, как вы можете подойти к этому. - person nEx.Software; 23.07.2012
comment
@nEx.Software О, хорошо, я подумал, что что-то ДОЛЖНО быть сделано с этими двумя операторами catch. Последний вопрос, возможно глупый. Как мне вызвать метод для фактической загрузки? Когда я помещаю SendTask(); в методе onClick я получаю сообщение неопределенного метода. - person tehman; 23.07.2012
comment
@nEx.Software Большое спасибо за вашу помощь! Это был отличный опыт обучения =] - person tehman; 24.07.2012
comment
Несколько советов для новичков, скопируйте и вставьте этот код: SendTask должен быть внутренним классом в вашем MainActivity, чтобы тосты работали. Вы не можете использовать общий OnClickListener, иначе ваш MainActivity не будет входить в область действия. Пусть ваш фрагмент реализует View.OnClickListener. Вам нужно установить <uses-permission android:name="android.permission.INTERNET" /> в AndroidManifest.XML. - person Noumenon; 19.09.2013

Добавьте поля к URL-адресу в качестве параметров.

String phone="phone=234432";
String name="name=John Smith";
String email="[email protected]"; 

Url = new URL("http://www.test.com?"+phone+"&"+name+"&"+email);

Не проверено, но должно работать в запросе GET Http.

person Andy Res    schedule 23.07.2012
comment
Я немного запутался, как это отправляет данные на указанный URL-адрес? - person tehman; 23.07.2012

//используем xml-запрос

String url="http://www.test.com";
String xmlRequest="<message xmlns=\"http://test.com/schemas/ma\"><header></header>"+
"<body><phone>9944556622</phone><name>Mytest name</name><email>[email protected]</email>"+"<comments>hay this seems nice</comments></body></message>"

HttpPost httppost = new HttpPost(url);
    StringEntity se = new StringEntity(xmlRequest,HTTP.UTF_8);


httppost.setHeader("Content-Type","application/xml");
httppost.setHeader("Accept","application/xml");

httppost.setEntity(se);

BasicHttpResponse httpResponse = (BasicHttpResponse) httpclient.execute(httppost);

   StatusLine statusLine = httpResponse.getStatusLine();
person Padma Kumar    schedule 23.07.2012
comment
Спасибо за ответ. Ты можешь пройти и объяснить мне, что ты делаешь? Могу ли я заменить статический текст в xml переменной? - person tehman; 23.07.2012
comment
на самом деле вам нужна ссылка на API, т.е. как отправить запрос и получить ответ с вашего сервера. - person Padma Kumar; 23.07.2012
comment
если у вас есть API, вам нужно сначала попробовать его в REST Client. если это удастся напрямую, вы можете сделать это в своей программе. - person Padma Kumar; 23.07.2012

person    schedule
comment
убедитесь, что вы создали androidmessages.html в том же каталоге, где находится файл php - person Sampath Kumar; 21.07.2015