0

私の予想は、私の Android アプリと CodeIgniter や YII のような任意の Web フレームワークで読み取ることができる Web サービスを構築することですが、最初に Android に実装することを望んでいます。私はすでに何が必要かを理解しようとしていますが、これについての経験がないため、いくつかの情報源を入手することができます.

RESTとSOAPの間で学んでみましたが、

REST : 最初に REST を選択し、このチュートリアルを試しましたが、Eclipse と Netbeans IDE の両方で構築した Web サービスに問題があり、Tomcat サーバーで Web サービスを実行すると、Tomcat が失敗しました。コンソールにこのように表示されます。(実際には、私はすでにそのチュートリアル ページに問題を投稿しましたが、著者はまだ私の質問に答えていません)。

Jun 21, 2012 7:49:11 AM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre7/bin/client;C:/Program Files/Java/jre7/bin;C:/Program Files/Java/jre7/lib/i386;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\Java\jdk1.6.0_16\bin;C:\Program Files\Java\jdk1.7.0_01\bin;C:\opencv\build\common\tbb\ia32\vc10\;C:\opencv\build\x86\vc10\bin\;C:\Server\apache-tomcat-6.0.26\bin;;D:\Progima\Eclipse JEE Indigo\eclipse;;.
Jun 21, 2012 7:49:11 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:Luna’ did not find a matching property.
Jun 21, 2012 7:49:12 AM org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Jun 21, 2012 7:49:12 AM org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Jun 21, 2012 7:49:12 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 612 ms
Jun 21, 2012 7:49:12 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jun 21, 2012 7:49:12 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.12
java.lang.IllegalAccessError: class com.sun.media.sound.AbstractPlayer cannot access its superclass com.sun.media.sound.AbstractMidiDevice
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1591)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)

しかし、EclipseでTomcatサーバーを右クリック>>一般>>場所の切り替えを試みてから再度実行すると、Tomcatを起動できます。Tomcat が起動されましたが、localhost:8080[slash]RestWebServiceDemo[slash]rest[slash]person (このチュートリアルに基づく) を実行すると、まだエラー 404 が発生します。何が起こるかわかりません。

SOAP : では、REST 以外のソリューションを試してみたいと思います。私はこのチュートリアルを見つけました。すでに試してみました.EclipseとNetbeansの両方でWebサービスを構築しました. Eclipse では、サーバーを起動しようとすると、上記と同じことが再び発生します。Netbeans では、Web サービスは正常に実行され、正常に開始でき、wsdl localhost:9090[slash]Ladodi[slash]Hello?wsdl を実行できます。しかし、Android から取得しようとすると、TextView にデータが表示されませんでした。

私の Netbeans のコードは次のようになります。チュートリアルでは操作にパラメーターがなく、もちろん後で操作にパラメーターが必要になるため、パラメーターありとパラメーターなしの 2 つの操作を作成します。

package love.care;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

/**
 *
 * @author Setyadi
 */
@WebService()
public class Hello {

    /**
     * Web service operation
     */
    @WebMethod(operationName = "Hai")
    public String Hai(@WebParam(name = "nama")
    String nama) {
        //TODO write your implementation code here:
        return "Hai";
    }

    /**
     * Web service operation
     */
    @WebMethod(operationName = "Kerupuk")
    public String Kerupuk() {
        //TODO write your implementation code here:
        return "Cocote";
    }

}

ここに、「Kerupuk」操作(パラメーターなし)を取得するための私のEclipseのAndroidコードがあります。

package in.figure.on.mobile;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebServiceActivity extends Activity{

    private static final String NAMESPACE = "http://care.love/";
    private static String URL = "http://localhost:9090/Ladodi/Hello?wsdl"; 
    private static final String METHOD_NAME = "Kerupuk";
    private static final String SOAP_ACTION =  "http://care.love/Kerupuk";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);  

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

        HttpTransportSE ht = new HttpTransportSE(URL);
        try {
         ht.call(SOAP_ACTION, envelope);
            SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

            TextView helloTV = (TextView) findViewById(R.id.textHello);
            helloTV.setText("Asaa :"+response.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ここに、「Hai」操作(パラメーター付き)を取得するためのEclipseのAndroidコードがあり、「AdityaSetyadi」をパラメーターとして渡したいです。

package in.figure.on.mobile;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebServiceActivity extends Activity{

    private static final String NAMESPACE = "http://care.love/";
    private static String URL = "http://localhost:9090/Ladodi/Hello?wsdl"; 
    private static final String METHOD_NAME = "Hai";
    private static final String SOAP_ACTION =  "http://care.love/Hai";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);  

          PropertyInfo propInfo = new PropertyInfo();
          propInfo.setName("nama");
          propInfo.setValue("AdityaSetyadi");
          propInfo.setType(PropertyInfo.STRING_CLASS);
          request.addProperty(propInfo);

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

        HttpTransportSE ht = new HttpTransportSE(URL);
        try {
         ht.call(SOAP_ACTION, envelope);
            SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

            TextView helloTV = (TextView) findViewById(R.id.textHello);
            helloTV.setText("Asaa :"+response.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

両者の違いは PropertyInfo にあります。addProperty でパラメータを渡そうとするので、このチュートリアルのコードを試してみますが、このようにコーディングしようとすると。しかし addProperty は非推奨なので、上記のコードを試してみます。

        PropertyInfo propInfo=new PropertyInfo();
        propInfo.name="arg0";
        propInfo.type=PropertyInfo.STRING_CLASS;

        request.addProperty(propInfo, "John Smith"); 

しかし、データはまだ TextView に表示されません。どうすればよいかわかりません。誰でも助けることができますか?または、別のチュートリアルを教えてください。よろしくお願いします。@AdityaSetyadi

:'(

4

2 に答える 2

0

Webサービスは.NETではなくJAX-WSであるため、次のように置き換えることをお勧めしますenvelope.dotNet = true;envelope.dotNet = false;

于 2012-09-28T09:58:21.130 に答える
0

SoapObject respone = (SoapObject) envelope.bodyIn; この行の代わりにこれを試してみませんか

SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

パラメータを追加したい場合は、別の方法があります

request.addProperty("parameter",value);

それ以外のPropertyInfo

他の重要なことは、あなたがすべてやったのかもしれません

1) プロジェクトのマニフェスト ファイルに use Internet パーミッションを追加します。

2) を確認NAMESPACEしてください。SOAP_ACTIONあなたの に従って正しく書かれていますWebservicewebserviceブラウザでNAMESPACE開いて確認できますSOAP_ACTION。両方とも記載があります。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-06-27T04:45:35.173 に答える