Форум программистов, компьютерный форум CyberForum.ru

Отправка POST запроса - Android

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.82
mizha
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 107
29.11.2013, 01:50     Отправка POST запроса #1
Здравствуйте! Решил попробовать написать приложение на Android. Задачу поставил такую, что надо отправить с android-а на сервер post запрос, но что-то видимо делаю не так, ниже приведу пример своего кода из Java и php. Что я не так делаю?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://127.0.0.1/all/index.php");
 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("login", "andro"));
    nameValuePairs.add(new BasicNameValuePair("text", "Привет!"));
    try {
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    } catch (UnsupportedEncodingException e) {
                        
         e.printStackTrace();
    }
 
    try {
        HttpResponse response = httpclient.execute(httppost);
    } catch (ClientProtocolException e) {
                        
        e.printStackTrace();
    } catch (IOException e) {
                        
        e.printStackTrace();
    }
PHP

PHP
1
2
3
4
5
6
$mylogin = $_POST['login'];
if($mylogin != null)
{
     $fp = fopen("counter.txt", "a"); 
     $test = fwrite($fp, $mylogin);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
29.11.2013, 09:52     Отправка POST запроса #2
в отдельном потоке:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
                    URL url = new URL("http://api.ololo.net/user/info/?email="
                            + sPref.getString("mail", "") + "&pass="
                            + sPref.getString("pass", ""));
                    HttpURLConnection con = (HttpURLConnection) url.openConnection();
 
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(con.getInputStream()));
                    StringBuilder sb = new StringBuilder();
                    String line;
                    while ((line = br.readLine()) != null) {                               //считываем ответ с сервера в строку
                        sb.append(line + "\n");
                    }
                    br.close();
а на пхп вы должны написать соответствующие апи, отвечающее на подобные запросы .
Wenceslaus
Android Developer
 Аватар для Wenceslaus
129 / 129 / 4
Регистрация: 05.07.2013
Сообщений: 205
29.11.2013, 13:00     Отправка POST запроса #3
mizha, код правильный. Запускайте его в отдельном потоке и добавьте обратную связь с сервером:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
new Thread(new Runnable() {
 
    @Override
    public void run() {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://127.0.0.1/all/index.php");
 
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("login", "andro"));
        nameValuePairs.add(new BasicNameValuePair("text", "Привет!"));
        try {
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
 
        try {
            HttpResponse response = httpclient.execute(httppost);
            String request = inputStreamToString(response.getEntity().getContent());
            Log.v("request", request + "!");
 
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
    private String inputStreamToString(InputStream is) throws IOException {
        String line = "";
        StringBuilder total = new StringBuilder();
 
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
 
        while ((line = rd.readLine()) != null)
            total.append(line);
 
        return total.toString();
    }
 
}).start();
PHP
1
2
3
4
5
6
7
if (isset($_POST['login']) && isset($_POST['text'])) {
    $fp = fopen("counter.txt", "a"); 
    $test = fwrite($fp, $mylogin);
    echo "true";
} else {
    echo "false";
}
и проверьте манифест на наличие permission'а:
XML
1
<uses-permission android:name="android.permission.INTERNET" />
Если ошибка повторится, выкладывайте лог, будем разбираться..
mizha
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 107
29.11.2013, 14:52  [ТС]     Отправка POST запроса #4
Спасибо, что сказали по поводу permission'а, потому что я о нём не знал и конечно у меня его не было в манифесте)) Буквально второй день, как пробую, что-то запилить на этом всём...

Я ниже приведу пример всего своего класса, т.к. я добавил поток, но это мне особо не помогло.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class MainActivity extends Activity {
 
    
    Button btn;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btn = (Button)findViewById(R.id.button1);
        
        OnClickListener oclBtn = new OnClickListener(){
            
            public void onClick(View v){
                new Thread(new Runnable() {
                     
                    @Override
                    public void run() {
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("127.0.0.1/all/index.php");
                 
                        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                        nameValuePairs.add(new BasicNameValuePair("login", "andro"));
                        nameValuePairs.add(new BasicNameValuePair("text", "Привет!"));
                        try {
                            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                 
                        try {
                            HttpResponse response = httpclient.execute(httppost);
                            String request = inputStreamToString(response.getEntity().getContent());
                            Log.v("request", request + "!");
                 
                        } catch (ClientProtocolException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                 
                    }
                 
                    private String inputStreamToString(InputStream is) throws IOException {
                        String line = "";
                        StringBuilder total = new StringBuilder();
                 
                        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
                 
                        while ((line = rd.readLine()) != null)
                            total.append(line);
                 
                        return total.toString();
                    }
                 
                }).start();
             }
        };
        
        btn.setOnClickListener(oclBtn);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}
Вот что пишет в логе:

11-29 10:23:30.523: W/dalvikvm(333): threadid=9: thread exiting with uncaught exception (group=0x40015560)
11-29 10:23:30.533: E/AndroidRuntime(333): FATAL EXCEPTION: Thread-10
11-29 10:23:30.533: E/AndroidRuntime(333): java.lang.IllegalStateException: Target host must not be null, or set in parameters.
11-29 10:23:30.533: E/AndroidRuntime(333): at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:572)
11-29 10:23:30.533: E/AndroidRuntime(333): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:292)
11-29 10:23:30.533: E/AndroidRuntime(333): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
11-29 10:23:30.533: E/AndroidRuntime(333): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
11-29 10:23:30.533: E/AndroidRuntime(333): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
11-29 10:23:30.533: E/AndroidRuntime(333): at com.example.reseptionsms.MainActivity$1$1.run(MainActivity.java:62)
11-29 10:23:30.533: E/AndroidRuntime(333): at java.lang.Thread.run(Thread.java:1019)



В php я ничего не менял у себя или сервер в любом случае должен дать какой либо ответ?
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
29.11.2013, 15:19     Отправка POST запроса #5
http://dajver.blogspot.com/2013/02/json.html как туториал, там и посылание запроса в отдельном потоке, и сервер на пхп
Wenceslaus
Android Developer
 Аватар для Wenceslaus
129 / 129 / 4
Регистрация: 05.07.2013
Сообщений: 205
29.11.2013, 18:06     Отправка POST запроса #6
mizha, ошибка здесь:
Java
1
HttpPost httppost = new HttpPost("127.0.0.1/all/index.php"); // упустили http://
mizha
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 107
29.11.2013, 18:21  [ТС]     Отправка POST запроса #7
Wenceslaus, дописал "http://" результат остался не изменным.

dajver, попробовал как написано в примере, сделал у себя такой же php файл, но результат не получил используя адрес http://127.0.0.1/all/index.php, а при использовании адреса который указан в примере ответ приходит.

Возможно какая-то проблема в самом локальном сервере?
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
29.11.2013, 18:23     Отправка POST запроса #8
Цитата Сообщение от mizha Посмотреть сообщение
dajver, попробовал как написано в примере, сделал у себя такой же php файл, но результат не получил используя адрес http://127.0.0.1/all/index.php, а при использовании адреса который указан в примере ответ приходит.

Возможно какая-то проблема в самом локальном сервере?
Скорей всего у вас этот адрес не открыт для интернета, поройтесь в настройках денвера или вампа, что у вас там стоит, и посмотрите есть ли доступ в интернет у вашего ресурса.
mizha
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 107
29.11.2013, 18:28  [ТС]     Отправка POST запроса #9
Извините, забыл указать - я использую xampp. Мои скрипты могут иметь доступ в интернет и загружать необходимые ресурсы, а вот их в доступ дать не могу. Мои ресурсы могут смотреть только те, кто подключен в мою wi-fi сеть.
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
29.11.2013, 18:34     Отправка POST запроса #10
Цитата Сообщение от mizha Посмотреть сообщение
Извините, забыл указать - я использую xampp. Мои скрипты могут иметь доступ в интернет и загружать необходимые ресурсы, а вот их в доступ дать не могу. Мои ресурсы могут смотреть только те, кто подключен в мою wi-fi сеть.
Ну дело в доступе к данным, а не в работе приложения, если приложение работает на других сайтах значит и на вашем должно работать, проблема в сервере. Создайте на бесплатном хостинге сервер, и попробуйте через него поработать, если не получается с собственным.
mizha
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 107
30.11.2013, 01:11  [ТС]     Отправка POST запроса #11
Всё верно. Оба скрипта рабочие, дело было в сервере. Что помогли и направили в нужную сторону.

Добавлено через 5 часов 42 минуты
Возник новый вопрос для продолжения этой темы. У меня есть 2 класса(MainActivity и SmsReceiver). В классе MainActivity у меня есть метод который загружает данные из Preferences(метод работает), но вопрос собственно вот в чем: не знаю как вызвать этот метод в классе SmsReceiver.
Пробовал создать объект и через него вызвать метод, но приложение вырубается.

Как можно его вызвать?
mizha
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 107
02.12.2013, 11:29  [ТС]     Отправка POST запроса #12
Вопрос актуалне
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
02.12.2013, 15:20     Отправка POST запроса #13
Цитата Сообщение от mizha Посмотреть сообщение
Всё верно. Оба скрипта рабочие, дело было в сервере. Что помогли и направили в нужную сторону.

Добавлено через 5 часов 42 минуты
Возник новый вопрос для продолжения этой темы. У меня есть 2 класса(MainActivity и SmsReceiver). В классе MainActivity у меня есть метод который загружает данные из Preferences(метод работает), но вопрос собственно вот в чем: не знаю как вызвать этот метод в классе SmsReceiver.
Пробовал создать объект и через него вызвать метод, но приложение вырубается.

Как можно его вызвать?
Можно код класса и как вы вызываете?
mizha
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 107
02.12.2013, 23:53  [ТС]     Отправка POST запроса #14
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class MainActivity extends Activity {
 
    
    Button btnSettings;
    EditText edText;
    SharedPreferences sPref;
    final String SAVED_TEXT = "saved_text";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnSettings = (Button)findViewById(R.id.button1);
        edText = (EditText)findViewById(R.id.txtSettings);      
        
        LoadSettings();
        
        OnClickListener oclBtn = new OnClickListener(){
            public void onClick(View v){
                SaveSettings();
        }};
        
        btnSettings.setOnClickListener(oclBtn);
    }
    
    void SaveSettings(){
        sPref = getPreferences(MODE_PRIVATE);
        Editor ed = sPref.edit();
        ed.putString(SAVED_TEXT,edText.getText().toString());
        ed.commit();
        Toast.makeText(getApplicationContext(), "Info is save", Toast.LENGTH_SHORT).show();
    }
    
    public String LoadSettings(){
        sPref = getPreferences(MODE_PRIVATE);
        String savedSettings = sPref.getString(SAVED_TEXT,"");
        edText.setText(savedSettings);
        
        return savedSettings;
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}
Вызвать пробовал так:

Java
1
2
3
MainActivity mn_obj = new MainActivity();
mn_obj.LoadSettings();
Toast.makeText(ctx, mm.LoadSettings(), Toast.LENGTH_SHORT).show();
dajver
 Аватар для dajver
406 / 270 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
03.12.2013, 00:37     Отправка POST запроса #15
Попробуйте доставать вот так

Java
1
2
String TEXT= sPref.getString("saved_text", "");
Toast.makeText(ctx,TEXT, Toast.LENGTH_SHORT).show();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 02:15     Отправка POST запроса
Еще ссылки по теме:

Android Обработка результата POST-запроса в Android
Отправка Post запроса в Android предложении Android
Android Отправка POST
Отправка post запросов на сервер Android
Отправка POST запроса Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
mizha
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 107
03.12.2013, 02:15  [ТС]     Отправка POST запроса #16
функция сама по себе рабочая. Я проверял её в пределах класса MainActivity и она показывала результат, а мне я её пробую вызвать в другом классе. У меня 2 класса - MainActivity и SmsReceiver. Ниже я приведу код класса SmsReceiver:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class SmsReceiver extends BroadcastReceiver {
    
    MainActivity mm;
    @Override
    public void onReceive(Context ctx, Intent intent) 
    {
                 /*.......*/
                 mm = new MainActivity();
               new Thread(new Runnable() {
             
                @Override
                public void run() {
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost("http://mysite.com/index.php");
Вместо "http://mysite.com/index.php" я хочу вставить mm.LoadSettings();
Когда я таким образом вызывают функци, то код говорит, что мол не знает такой функции. Хотя в MainActivity она у меня PUBLIC. Вот в этом у меня и возник вопрос. Как вызвать функцию LoadSettings() из класса MainActivity в классе SmsReceiver.
Yandex
Объявления
03.12.2013, 02:15     Отправка POST запроса
Ответ Создать тему
Опции темы

Текущее время: 02:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru