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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.92
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
#1

Post запрос XML - Android

07.12.2012, 20:04. Просмотров 3077. Ответов 22
Метки нет (Все метки)

Добрый день, подскажите, как сделать post запрос, отправляться должна xml вида:
XML
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8" ?>
<data>
<login>debugger</login>
<password>123456</password>
</data>
В интернете смотрел примеры, они не подходят, а те что я пробовал как пример делать тупо крашат приложение...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
prtigger
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 6
07.12.2012, 21:03     Post запрос XML #2
Как-то примерно так:

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
string XML="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<data>
<login>debugger</login>
<password>123456</password>
</data>";
 
String requestString = "http://" + address + ":" + port + "/Portal";
 
String sendXML = "Document="+XML;
 
URL url = new URL(requestString);
URLConnection connection = url.openConnection();
 
HttpURLConnection httpConnection = (HttpURLConnection) connection;
httpConnection.setRequestMethod("POST");
 
httpConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
httpConnection.setRequestProperty("Accept-Encoding","gzip, deflate");
httpConnection.setRequestProperty("Cache-Control","no-cache");
httpConnection.setRequestProperty("Content-Length", ""+ Integer.toString(sendXML.getBytes().length));
httpConnection.setDoOutput(true);
httpConnection.setDoInput(true);
 
httpConnection.connect();
 
// здесь можем писать в поток данные запроса
OutputStream os = httpConnection.getOutputStream();
os.write(sendXML.getBytes());
os.flush();
os.close();
 
int responseCode = httpConnection.getResponseCode();
 
if (responseCode == HttpURLConnection.HTTP_OK)
{
    InputStream in = httpConnection.getInputStream();
    InputStreamReader isr = new InputStreamReader(in,"windows-1251");
 
    StringBuffer data = new StringBuffer();
    int ch;
    while ((ch = isr.read()) != -1)
    {
        data.append((char) ch);
    }
 
    resultString = new String(data.toString());
    resultString = "" + resultString;
} else
{
    errorText = "Сервер не отвечает";
    return;
}
Document - имя параметра, из которого извлекается XML в обработчике на сервере
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
07.12.2012, 21:41  [ТС]     Post запрос XML #3
Не работает, запихал в проект, куча ошибок... Нажал на кнопку logcat вообще взбесился ))
prtigger
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 6
07.12.2012, 21:55     Post запрос XML #4
Что за ошибки-то??
Хотя бы пример.

Сразу хочу предупредить, в версиях андроида >3 запрещено обращаться к сети в интерфейсном потоке.
Этот код надо создавать в отдельном потоке.

Что-то типа:
Java
1
2
3
4
5
6
7
Thread t = new Thread(new Runnable()
{
    public void run()
    {
                           // Вот тут код обращения в сеть
    }
}).start();
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
07.12.2012, 23:20  [ТС]     Post запрос XML #5
Я вроде для 2.2 делаю ) Я в этом не особо разбираюсь, новичок...

Добавлено через 3 минуты
Ну суть я кажется уловил, тоесть если запускать это приложение на 3.0 и выше андроидах, то нужно делать через Runables ?
prtigger
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 6
08.12.2012, 19:49     Post запрос XML #6
Да не, само приложение ни к чему.
Именно тот код, что работает с сетью.

Что там с ошибками? давай лог, подскажу, чем могу
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
09.12.2012, 02:21  [ТС]     Post запрос XML #7
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
package com.example.test;
 
import java.io.IOException;
 
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    TextView nameView;
    @Override
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        nameView = (TextView) findViewById(R.id.textView1); 
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
public void onClickFirst(View v){
    Thread test = new Thread(new Runnable()
    { 
        public void run()
        {
            
            String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                            "<data>" +
                            "<login>test</login>" +
                            "<password>test</password>" +
                            "</data>";
       HttpClient httpclient = new DefaultHttpClient();
       HttpPost httppost = new HttpPost("http://*********/Service/XMLService.asmx/Balance");
 
       try {
           httppost.setEntity(new StringEntity(str));
           HttpResponse response = httpclient.execute(httppost);
           nameView.setText(response.toString());  
       } catch (ClientProtocolException e) {
 
       } catch (IOException e) {
          nameView.setText("Error");
       }
        }
    }); test.start();
    }
    
}
Вот такой код я написал...
В проекте указывал версию андроида 4.0.3
Когда на кнопку нажимаю, приложение крашится...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 02:29     Post запрос XML #8
читайте логи.

Добавлено через 1 минуту
Цитата Сообщение от Critically Посмотреть сообщение
nameView.setText(response.toString());
Цитата Сообщение от Critically Посмотреть сообщение
nameView.setText("Error");
нельзя из другого потока...

Добавлено через 1 минуту
Java
1
2
3
4
5
nameView.post(new Runnable(){
 public void run () {
  nameView.setText(response.toString());
 }
});
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
09.12.2012, 02:39  [ТС]     Post запрос XML #9
А вот собственно logcat

Код
12-08 22:35:28.357: D/dalvikvm(531): Not late-enabling CheckJNI (already on)
12-08 22:35:29.217: I/dalvikvm(531): threadid=3: reacting to signal 3
12-08 22:35:29.277: I/dalvikvm(531): Wrote stack traces to '/data/anr/traces.txt'
12-08 22:35:29.547: D/gralloc_goldfish(531): Emulator without GPU emulation detected.
12-08 22:35:39.636: W/dalvikvm(531): threadid=11: thread exiting with uncaught exception (group=0x409c01f8)
12-08 22:35:39.646: E/AndroidRuntime(531): FATAL EXCEPTION: Thread-72
12-08 22:35:39.646: E/AndroidRuntime(531): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.view.View.requestLayout(View.java:12675)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.view.View.requestLayout(View.java:12675)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.view.View.requestLayout(View.java:12675)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.view.View.requestLayout(View.java:12675)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.view.View.requestLayout(View.java:12675)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.widget.TextView.checkForRelayout(TextView.java:6773)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.widget.TextView.setText(TextView.java:3306)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.widget.TextView.setText(TextView.java:3162)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at android.widget.TextView.setText(TextView.java:3137)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at com.example.test.MainActivity$1.run(MainActivity.java:56)
12-08 22:35:39.646: E/AndroidRuntime(531): 	at java.lang.Thread.run(Thread.java:856)
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 04:13     Post запрос XML #10
Цитата Сообщение от V0v1k Посмотреть сообщение
Java
1
2
3
4
5
nameView.post(new Runnable(){
*public void run () {
* nameView.setText(response.toString());
*}
});
.....
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
09.12.2012, 15:55  [ТС]     Post запрос XML #11
Буду признателен, если подскажите куда это нужно вставить ?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 16:21     Post запрос XML #12
туда же.
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
09.12.2012, 19:09  [ТС]     Post запрос XML #13
Дому буду попробую заменить, лог выложу... Буду надеяться конечно что все пройдет удачно..

Добавлено через 1 час 42 минуты
Вот вставил как вы сказали... Только программа попросила добавить Final... Вроде заработало в текст вывело "Error"... Теперь вопрос, как узнать почему Error ? Как отловить ошибку ? Debugger Eclipsa пока не очень понятен для меня.. В манифесте прописал debbugebble=true;
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
       try {
           httppost.setEntity(new StringEntity(str));
           final HttpResponse response = httpclient.execute(httppost); <----- Вставил final
           nameView.post(new Runnable(){
               public void run () {
                nameView.setText(response.toString());
               }
              }); 
       } catch (ClientProtocolException e) {
 
       } catch (IOException e) {
           nameView.post(new Runnable(){
               public void run () {
                nameView.setText("Error");
               }
              });
       }
        }
    }); test.start();
    }
    
}
Добавлено через 10 минут
Java
1
final HttpResponse response = httpclient.execute(httppost);
Вот с этой строчки перескакивает на Exception... Как узнать что ему не нравиться ?

В манифесте permissions Internet прописан
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 19:20     Post запрос XML #14
e.printStackTrace();
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
09.12.2012, 21:02  [ТС]     Post запрос XML #15
Куда это вписать ?

Добавлено через 11 минут
java.net.UnknownHostException: Unable to resolve host "smsservice2.itakazan.ru": No address associated with hostnam
Вот такая ошибка вылезла, что это значит ? Я с Delphi post запросы шлю на этот же адрес и все хорошо...

Добавлено через 25 минут
XML
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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <permission android:name="android.permission.INTERNET"></permission>
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.example.test.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Может кроме android.permission.INTERNET надо еще что то вписать... Тестил и на телефоне с интернетом и на эмуляторе...

Добавлено через 10 минут
Вроде заработало... Теперь приходит вот это org.apache.http.message.BasicHttpResponse@(Какие то цифры каждый раз меняющиеся)... Что это такое ? В ответ должна приходить XMLка (((

Добавлено через 17 минут
Ага приходит это из за того что nameView.setText(response.toString()); Как же его обработать тогда ?

Добавлено через 30 минут
Ну все ништяк, приходит ответ в виде XMLки, теперь вопрос, как ее спарсить ? Может кто с этим помочь ?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 21:30     Post запрос XML #16
http://www.androidhive.info/2011/11/...sing-tutorial/
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
09.12.2012, 23:26  [ТС]     Post запрос XML #17
XMLParser - создал класс, запихал туда то что требовалось...
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.example.test;
 
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
 
import android.sax.Element;
import android.util.Log;
 
public class XMLParser {
    public String getXmlFromUrl(String url) {
        String xml = null;
 
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
 
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);
 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // return XML
        return xml;
    }
    
    public Document getDomElement(String xml){
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
 
            DocumentBuilder db = dbf.newDocumentBuilder();
 
            InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(xml));
                doc = db.parse(is); 
 
            } catch (ParserConfigurationException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            } catch (SAXException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            } catch (IOException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            }
                // return DOM
            return doc;
    }
 
    public String getValue(Element item, String str) {
        NodeList n = ((Document) item).getElementsByTagName(str);
        return this.getElementValue(n.item(0));
    }
     
    public final String getElementValue( Node elem ) {
             Node child;
             if( elem != null){
                 if (elem.hasChildNodes()){
                     for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                         if( child.getNodeType() == Node.TEXT_NODE  ){
                             return child.getNodeValue();
                         }
                     }
                 }
             }
             return "";
      } 
}
Далее вызываю все это дело в мейне
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 void onClickFirst(View v){
    Thread test = new Thread(new Runnable()
    { 
        public void run()
        {  
            String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +
                         "<data>" +
                         "<login>test</login>" +
                         "<password>test</password>" +
                         "</data>";
       
       HttpClient httpclient = new DefaultHttpClient();
       HttpPost httppost = new HttpPost("http://***********/Service/XMLService.asmx/Balance");
 
       try {
          
           httppost.setEntity(new StringEntity(str));
           final HttpResponse response = httpclient.execute(httppost);
           nameView.post(new Runnable(){
               private Element e;
 
            public void run () {
                   HttpEntity mResEntityGet = response.getEntity();
                    if (mResEntityGet != null) {
                       
                                           String content;
                                           String name = "";
                                           String cost = "";
                                           String description = "";
                                     final String KEY_ITEM = "Data"; // parent node
                                     final String KEY_NAME = "Code";
                                     final String KEY_COST = "Account";
                                     final String KEY_DESC = "Price";
                            try {
                                content = EntityUtils.toString(mResEntityGet);
 
                                 
                                XMLParser parser = new XMLParser();
                                Document doc = parser.getDomElement(content); // getting DOM element
                                 
                                NodeList nl = doc.getElementsByTagName(KEY_ITEM);
                                 
                                // looping through all item nodes <item>
                                for (int i = 0; i < nl.getLength(); i++) {
                                     name = parser.getValue(e, KEY_NAME); // name child value
                                     cost = parser.getValue(e, KEY_COST); // cost child value
                                     description = parser.getValue(e, KEY_DESC); // description child value
                                }
                                nameView.setText(name);
                                                                                
                            } catch (ParseException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }        
                    }
               }
           }); 
       
       } catch (ClientProtocolException e) {
           e.printStackTrace();
       } catch (final IOException e) {
           e.printStackTrace();
          }
        }
    }); test.start();
    }
    
}
При нажатии на кнопку получаю пустой TextView, хотя туда должно зуписаться значение name.... Как проверить какое значение получают мои переменные name, cost, description ?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 23:38     Post запрос XML #18
подебагай.
Critically
10 / 10 / 0
Регистрация: 14.03.2011
Сообщений: 337
09.12.2012, 23:55  [ТС]     Post запрос XML #19
Приходит вот такая XMLка
XML
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<data>
  <code>1</code>
  <descr>
  </descr>
  <account>42,9</account>
  <price>,50</price>
</data>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 00:13     Post запрос XML
Еще ссылки по теме:

Android POST Запрос
Android Post запрос
Android Оборвать POST-запрос к серверу
POST запрос Android
Android Не передается POST запрос

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

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.12.2012, 00:13     Post запрос XML #20
и что?
Yandex
Объявления
10.12.2012, 00:13     Post запрос XML
Ответ Создать тему
Опции темы

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