Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
1

Post запрос XML

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

Author24 — интернет-сервис помощи студентам
Добрый день, подскажите, как сделать post запрос, отправляться должна xml вида:
XML
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8" ?>
<data>
<login>debugger</login>
<password>123456</password>
</data>
В интернете смотрел примеры, они не подходят, а те что я пробовал как пример делать тупо крашат приложение...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2012, 20:04
Ответы с готовыми решениями:

Как отправить на сервер xml запрос с помощью post и получить ответ в xml?
нужно отправить на сервер xml запрос с помощью post и получить ответ в xml, погуглил нашел примеры,...

POST запрос с XML?
Нужно отправить запрос с ключем - xml_request вот текст и сприн из postman - рабочий ...

POST запрос, XML в c++
POST /feeds/api/users/default/subscriptions HTTP/1.1 Host: gdata.youtube.com Content-Type:...

POST запрос в Формате XML
Всем доброго времени суток! В VBA я новичок, потому обращаюсь за советом к мастерам. Хочу...

22
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 6
07.12.2012, 21:03 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 в обработчике на сервере
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
07.12.2012, 21:41  [ТС] 3
Не работает, запихал в проект, куча ошибок... Нажал на кнопку logcat вообще взбесился ))
0
0 / 0 / 0
Регистрация: 07.12.2012
Сообщений: 6
07.12.2012, 21:55 4
Что за ошибки-то??
Хотя бы пример.

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

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

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

Что там с ошибками? давай лог, подскажу, чем могу
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
09.12.2012, 02:21  [ТС] 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
Когда на кнопку нажимаю, приложение крашится...
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 02:29 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());
 }
});
1
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
09.12.2012, 02:39  [ТС] 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)
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 04:13 10
Цитата Сообщение от V0v1k Посмотреть сообщение
Java
1
2
3
4
5
nameView.post(new Runnable(){
*public void run () {
* nameView.setText(response.toString());
*}
});
.....
1
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
09.12.2012, 15:55  [ТС] 11
Буду признателен, если подскажите куда это нужно вставить ?
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 16:21 12
туда же.
1
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
09.12.2012, 19:09  [ТС] 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 прописан
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 19:20 14
e.printStackTrace();
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
09.12.2012, 21:02  [ТС] 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ки, теперь вопрос, как ее спарсить ? Может кто с этим помочь ?
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 21:30 16
http://www.androidhive.info/20... -tutorial/
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
09.12.2012, 23:26  [ТС] 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 ?
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.12.2012, 23:38 18
подебагай.
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
09.12.2012, 23:55  [ТС] 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>
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.12.2012, 00:13 20
и что?
0
10.12.2012, 00:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2012, 00:13
Помогаю со студенческими работами здесь

Post запрос через сокеты: вместо XML приходят некорректные символы
Задача: отправить на сервер POST запрос. Получить ответ. Расшифровать его. Через Charles я...

Послать POST запрос запрос с двумя и более параметрами?
Делаю так: string ProxyString = &quot;&quot;; string URI =...

Get запрос + куки + Post запрос
Добрый день. Подскажите как решить следующую ситуацию: 1. Нужно отправить get запрос. 2. В...

Отправка XML Post запросом
Здравствуйте! Пытаюсь сделать кнопку для выписки счета на вебмани. Формат запроса ...

Отправка xml через POST
Привет! Нужно отправить некий xml-файл ч/з форму. Сам xml-файл используется как шаблон, просто...

Отправка Xml методом "post"
Подскажите, пожалуйста, как можно из БД Лотус отправить HTTP-запрос серверу методом &quot;POST&quot;? Запрос...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru