-->

Sending XML to a Web Service in Android

2020-07-18 07:49发布

问题:

I want to send this as XML to my Web Service. How should I do that?

<dmi:ShipNoticeRequest xmlns:dmi="http://portal.suppliesnet.net">
<dmi:RequesterISA>xxxxxxxxxx</dmi:RequesterISA>
<dmi:ShipDateRange>
<dmi:ShipDateFrom>2009-09-09</dmi: ShipDateFrom>
<dmi:ShipDateTo>2009-09-10</dmi: ShipDateTo>
</dmi: ShipDateRange >
</dmi:ShipNoticeRequest> 

My Web Service method required this type of request message:

POST /ShipNotice/WebServiceShipNotice.asmx HTTP/1.1
Host: portal.suppliesnet.net
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://portal.suppliesnet.net/RequestShipmentNoticeXML"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <RequestShipmentNoticeXML xmlns="http://portal.suppliesnet.net">
      <ShipNoticeRequestNode>xml</ShipNoticeRequestNode>
    </RequestShipmentNoticeXML>
  </soap:Body>
</soap:Envelope> 

I am tring this method but geeting an unknown error Can you figure out what is wrong with this code?

try {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory
                    .newDocumentBuilder();
            Document document = documentBuilder.newDocument();
            Element rootElement = document.createElement("soap:Envelope");
            rootElement.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
            rootElement.setAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
            rootElement.setAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");


            document.appendChild(rootElement);

            Element SoapBody = document.createElement("soap:Body");
            rootElement.appendChild(SoapBody);

            Element RequestShipmentNoticeXML = document.createElement("RequestShipmentNoticeXML");
            RequestShipmentNoticeXML.setAttribute("xmlns","http://portal.suppliesnet.net");
            SoapBody.appendChild(RequestShipmentNoticeXML);

            Element ShipmentNoticeRequestNode = document.createElement("ShipNoticeRequestNode");
            RequestShipmentNoticeXML.appendChild(ShipmentNoticeRequestNode);

            Element shipNoticeRequest = document.createElement("dmi:ShipNoticeRequest");
            shipNoticeRequest.setAttribute("xmlns:dmi", "http://portal.suppliesnet.net");

            ShipmentNoticeRequestNode.appendChild(shipNoticeRequest);

            Element ContactElement = document.createElement("dmi:RequesterISA");
            shipNoticeRequest.appendChild(ContactElement);
            ContactElement.appendChild(document.createTextNode("XXXXXX"));
// 1969-12-31


            Element articleElement = document.createElement("dmi:ShipDateRange");

            Element ShipDateFrom = document.createElement("dmi:ShipDateFrom");
            articleElement.appendChild(ShipDateFrom);
            ShipDateFrom.appendChild(document.createTextNode("2012-07-06"));

            Element ShipDateTo  = document.createElement("dmi:ShipDateTo");
            articleElement.appendChild(ShipDateTo);
            ShipDateTo.appendChild(document.createTextNode("2012-07-06"));

            shipNoticeRequest.appendChild(articleElement);


            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
            Properties outFormat = new Properties();

            outFormat.setProperty(OutputKeys.INDENT, "yes");
            outFormat.setProperty(OutputKeys.METHOD, "xml");
            outFormat.setProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
            outFormat.setProperty(OutputKeys.VERSION, "1.0");
            outFormat.setProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperties(outFormat);
            DOMSource domSource = new DOMSource(document.getDocumentElement());
            OutputStream output = new ByteArrayOutputStream();
            StreamResult result = new StreamResult(output);
            transformer.transform(domSource, result);
            xmlString = output.toString();

        } catch (ParserConfigurationException e) {
        } catch (TransformerConfigurationException e) {
        } catch (TransformerException e) {
        }

        SoapObject request = new SoapObject(namespace, methodName);
        request.addProperty("RequestShipmentNoticeXMl",xmlString);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        // envelope.headerIn.
        final HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

        androidHttpTransport.debug = true;
        try {
            androidHttpTransport.call(Soap_Action, envelope);
            //androidHttpTransport.
             SoapObject SoapResult = (SoapObject)envelope.bodyIn;
            tv.setText("Status" + SoapResult);
        } catch (Exception ex) {
            ex.printStackTrace();
            Log.e("static", "Exception in making call to server");
        }

回答1:

You want to send SOAP msg and Android don't have direct support for sending those kind of messages. There are 3rd party libraries like KSOAP2-android which you can try.
How should each SOAP msg look like is given by WSDL file on server side. Try to find it on the server and look how each msg should look. You can use soapUI to parse WSDL file for you.
If you don't use any 3rd party library as mentioned above you have to compose that msg by your self. You will need to create some sort of HTTP client like this:

HttpURLConnection conn = null;
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "text/xml");
conn.setRequestProperty("Content-Length", "" + postMessageInBytes.length);

Body of request will be created using for example XmlSerializer which will help you to write needed tags etc.



回答2:

You can use KSOAP2 to access web service, and your XML data can easily be sent as String...

1.Download the ksoap2 jar file

2.Start eclipse and create new android project

3.Right click on your project

4.Click properties

5.Click the java build path from the left pane

6.Select library tab

7.Click on add external jar

8.Browse the downloaded jar file

Your activity should look like this...

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.*;
import android.util.Log;
import android.widget.TextView;
import android.os.Bundle;

public class FinalWebServiceDemoActivity extends Activity {

// some parameters regarding your web-service to be invoked
private static final String SOAP_ACTION = "http://tempuri.org/WebServiceMethod";
private static final String METHOD_NAME = "WebServiceMethod";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://10.0.2.2:2256/WebService.asmx";

TextView tv;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tv=(TextView)findViewById(R.id.text1);
    call();
}

public void call()
{
    try {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("message","Put your XML data here...");

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet=true;
        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.call(SOAP_ACTION, envelope);

        SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
        String strRes = result.toString();

        tv.setText(strRes);
    } catch (Exception e) {
        tv.setText("Exception...");
        Log.i("exception", e.toString());
        StackTraceElement elements[] = e.getStackTrace();
        for (int i = 0, n = elements.length; i < n; i++) {      
            Log.i("File", elements[i].getFileName());
            Log.i("Line", String.valueOf(elements[i].getLineNumber()));
            Log.i("Method", elements[i].getMethodName());
        }
    }
}
}

Don't forget to add <uses-permission android:name="android.permission.INTERNET" /> permission in manifest file.

NOTE: This code is written to access .NET Web Services running on local machine and IPs are to access is form Android Emulator. Modify it where necessary.

Hope this helps...



回答3:

Try this (pure Java Standard):

        private WebServiceConnection(String xmlString) {

        InputStream responseInputStream = null;
        OutputStream requestOutputStream = null;

        HttpURLConnection httpURLConnection = null;

        try {

            // Form the URL
            URL url = new URL(URL_BASE + "?serviceId=3");

            // Set the HTTP URL connection
            httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setConnectTimeout(15000);
            httpURLConnection.setRequestProperty("Accept-Charset", "UTF-8");
            httpURLConnection.setRequestProperty("Content-Type", "text/html");

            // Send request
            requestOutputStream = httpURLConnection.getOutputStream();
            requestOutputStream.write(xmlString.getBytes("UTF-8"));

            // Receive response, then do anything with it
            responseInputStream = httpURLConnection.getInputStream();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch(SocketTimeoutException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }


回答4:

    package com.example.xmlfilecreator;

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.mime.MultipartEntity;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.entity.mime.content.StringBody;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import org.xmlpull.v1.XmlSerializer;

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Log;
    import android.util.Xml;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;

    public class XmlFileCreator extends Activity implements OnClickListener {
        public int i=0;
         Button b3;
         HttpEntity resEntity;
         public TextView tv;
         public String filename="";
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            b3 = (Button)findViewById(R.id.upload);
            tv = (TextView)findViewById(R.id.tv);
            b3.setOnClickListener(this);
            filename="addupload.xml";
            String[] no = new String[] {
                    "1",
                    "2",
                    "3",
                    "4",
                    "5",

                };
            String[] questype = new String[] {
                    "type1",
                    "type2",
                    "type3",
                    "type4",
                    "type5",     
                };
            String[] ques = new String[] {
                    "2+2",
                    "3+3",
                    "4+4",
                    "5+5",
                    "6+6",     
                };
            String[] cans = new String[] {
                    "4",
                    "6",
                    "8",
                    "10",
                    "12",     
                };
            String[] uans = new String[] {
                    "4",
                    "5",
                    "8",
                    "9",
                    "10",     
                };
//create a new file called "addupload.xml" in the SD card
        File newxmlfile = new File(Environment.getExternalStorageDirectory()+"/"+filename);
        try{
            newxmlfile.createNewFile();
        }catch(IOException e){
            Log.e("IOException", "exception in createNewFile() method");
        }
        //we have to bind the new file with a FileOutputStream
        FileOutputStream fileos = null;         
        try{
            fileos = new FileOutputStream(newxmlfile);
        }catch(FileNotFoundException e){
            Log.e("FileNotFoundException", "can't create FileOutputStream");
        }
        //we create a XmlSerializer in order to write xml data
        XmlSerializer serializer = Xml.newSerializer();
        try {
            //we set the FileOutputStream as output for the serializer, using UTF-8 encoding
            serializer.setOutput(fileos, "UTF-8");
            //Write <?xml declaration with encoding (if encoding not null) and standalone flag (if standalone not null) 
            serializer.startDocument(null, Boolean.valueOf(true)); 
            //set indentation option
            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 
            //start a tag called "root"
                serializer.startTag(null, "Worksheet"); 
                while(i<no.length)
                {
            //i indent code just to have a view similar to xml-tree
                    serializer.startTag(null, "Question");
                    //set an attribute called "attribute" with a "value" for <child2>
                    serializer.attribute(null, "number", no[i]);
                    serializer.endTag(null, "Question");

                    serializer.startTag(null, "QuestionType");
                    //write some text inside <child3>
                    serializer.text(questype[i]);
                    serializer.endTag(null, "QuestionType");


                    serializer.startTag(null, "Question");
                    serializer.text(ques[i]);
                    serializer.endTag(null, "Question");

                    serializer.startTag(null, "CorrectAnswer");
                    serializer.text(cans[i]);
                    serializer.endTag(null, "CorrectAnswer");

                    serializer.startTag(null, "UserAnswer");
                    serializer.text(uans[i]);
                    serializer.endTag(null, "UserAnswer");

                i=i+1;
                }

            serializer.endTag(null, "Worksheet");
            serializer.endDocument();
            //write xml data into the FileOutputStream
            serializer.flush();
            //finally we close the file stream
            fileos.close();

            TextView tv = (TextView)this.findViewById(R.id.result);
            tv.setText("file has been created on SD card");
        } catch (Exception e) {
            Log.e("Exception","error occurred while creating xml file");
        }
    }
    public void onClick(View v)
    {
        if(v==b3)
        {
            // if(!(selectedPath1.trim().equalsIgnoreCase("NONE")) && !(selectedPath2.trim().equalsIgnoreCase("NONE"))){
                  Thread thread=new Thread(new Runnable(){
                         public void run(){
                             doFileUpload();
                             runOnUiThread(new Runnable(){
                                 public void run() {
                                     tv.setText("uploaded successfully");
                                 }
                             });
                         }
                 });
                 thread.start();
        }
         }
    private void doFileUpload(){

        File file1 = new File("/mnt/sdcard/"+filename);
        File file2 = new File("/mnt/sdcard/mfqsheet.xml");
        String urlString = "http://192.168.1.20:8080/NpTest/fileUpload";
        try
        {
             HttpClient client = new DefaultHttpClient();
             HttpPost post = new HttpPost(urlString);
             FileBody bin1 = new FileBody(file1);
             FileBody bin2 = new FileBody(file2);
             MultipartEntity reqEntity = new MultipartEntity();
             reqEntity.addPart("uploadedfile1", bin1);
             reqEntity.addPart("uploadedfile2", bin2);
             reqEntity.addPart("user", new StringBody("User"));
             post.setEntity(reqEntity);
             HttpResponse response = client.execute(post);
             resEntity = response.getEntity();
             final String response_str = EntityUtils.toString(resEntity);
             if (resEntity != null) {
                 Log.i("RESPONSE",response_str);
                 runOnUiThread(new Runnable(){
                        public void run() {
                             try {

                              //  Toast.makeText(getApplicationContext(),"Upload <span id="IL_AD4" class="IL_AD">Complete</span>. Check the server uploads directory.", Toast.LENGTH_LONG).show();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                           }
                    });
             }
        }
        catch (Exception ex){
             Log.e("Debug", "error: " + ex.getMessage(), ex);
        }
      }
}