4

これを XML として Web サービスに送信したいと考えています。どうすればいいですか?

<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> 

私の Web サービス メソッドには、次のタイプの要求メッセージが必要でした:

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> 

この方法を試していますが、不明なエラーが発生しました。このコードの何が問題なのか分かりますか?

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");
        }
4

4 に答える 4

2

SOAP メッセージを送信したいのですが、Android はそのようなメッセージの送信を直接サポートしていません。試すことができる KSOAP2-android のようなサードパーティ ライブラリがあります。
各 SOAP メッセージがどのように表示されるかは、サーバー側の WSDL ファイルによって指定されます。サーバーでそれを見つけて、各メッセージがどのように表示されるかを確認してください。soapUI を使用して WSDL ファイルを解析できます。
上記のようにサードパーティのライブラリを使用しない場合は、そのメッセージを自分で作成する必要があります。次のような HTTP クライアントを作成する必要があります。

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

リクエストの本文は、必要なタグなどを記述するのに役立つ XmlSerializer などを使用して作成されます。

于 2012-08-12T10:08:48.240 に答える
1

KSOAP2を使用してWebサービスにアクセスでき、XMLデータを文字列として簡単に送信できます...

1.ksoap2jarファイルをダウンロードします

2. eclipseを起動し、新しいAndroidプロジェクトを作成します

3.プロジェクトを右クリックします

4.プロパティをクリックします

5.左側のペインからJavaビルドパスをクリックします

6.ライブラリタブを選択します

7.[外部jarの追加]をクリックします

8.ダウンロードしたjarファイルを参照します

あなたの活動はこのように見えるはずです...

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());
        }
    }
}
}

<uses-permission android:name="android.permission.INTERNET" />マニフェストファイルに権限を追加することを忘れないでください。

注:このコードは、ローカルマシンで実行されている.NET Webサービスにアクセスするために記述されており、IPはAndroidエミュレーターからアクセスします。必要に応じて変更してください。

お役に立てれば...

于 2012-08-15T13:40:20.243 に答える
1

これを試してください(純粋なJava標準):

        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();
        } 
    }
于 2012-08-16T22:00:05.770 に答える
0
    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);
        }
      }
}
于 2013-01-22T11:02:35.677 に答える