6

これまでに、PHPクライアントとVB.NETクライアントを作成しました。どちらもPHPWebサービスを正常に呼び出すことができます。後者を機能させるには、 SourceForgeのSoapUIツールを使用する必要がありました。私のwsdlはWS-Iに準拠していないとのことでした。ソープリクエストを直接編集できるため、サービスをインタラクティブにテストするためにProバージョンは必要ありませんでした。WSDLを修正し、VB.NetクライアントをAndroidとして機能させた後も、まだ問題があります。

また、ksoap2-andriodのソースコードを添付して、デバッグ中にステップスルーできるようにしました。少しは役に立ちましたが、ソースが含まれていないバンドルされた依存関係、特に「kxml2v1.6」があります。誰かが私にソースzipまたはJarを教えてくれるなら、私はそれをいただければ幸いです。

これは、AndroidクライアントからPHPWebサービスを呼び出すときに回避できないエラーです。

  org.xmlpull.v1.XmlPullParserException: expected: START_TAG   {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <definitions name='naturallyIrrationalsoapserver' targetNamespace='http://www.naturallyIrrational.com'>@10:42 in java.io.InputStreamReader@44dce560)

これは、WSDL \XMLを解析できないことを示しています。poistion@10.42は、開始定義タグの終わりです。

現在WS-Iに準拠しているWSDLとして、問題はKsoap2によって解釈されるこのサービス名前空間定義にあると思います。これは、それを呼び出すために使用される私のAndroidクライアントコードです。

public class SoapClientActivity extends Activity {
      @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = (TextView) findViewById(R.id.myText);
        String soapResponse="";
        final String METHOD_NAME = "getArrval";
        final String SOAP_ACTION = "http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.wsdl";
        final String NAMESPACE = "http://www.naturallyIrrational.com";

*この次の行は正しくなく、 http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.phpを指している必要があり ます*

        final String URL = "http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.wsdl";

        if (InternetStatus.getInstance(this).isOnline(this)) {

            try{                            
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);


                    PropertyInfo pi = new PropertyInfo();
            pi.setName("valname");
            pi.setValue("rt2");
            pi.setType(String.class);
            request.addProperty(pi);    

                 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
                    envelope.dotNet=false;
                    envelope.setOutputSoapObject(request); 
                    HttpTransportSE andHttpTransport = new HttpTransportSE(URL); 
                    andHttpTransport.debug = true;
                    andHttpTransport.call(SOAP_ACTION, envelope);

*この値を返すことに問題があります。受信されましたが、ksoapから返されるとエラーがスローされます*

 soapResponse = (String) envelope.getResponse();  //Exception is thrown here  
                        String strrequest = andHttpTransport.requestDump;
                        String strresponse = andHttpTransport.responseDump;

            }catch(Exception e){soapResponse = "Nope not working "+"\n\n" + e.getMessage() + "/n/n" + e.getStackTrace() ;}
            } else {soapResponse="You are not online"; }   


        tv.setText(soapResponse);    
    }
}

私が何か馬鹿げたことをしていて、誰かがそれを指摘できるなら、私はそれをいただければ幸いです。

PHPのようにAndroidでwsdlをキャッシュして再利用しないようにするディレクティブはありますか?

たぶん、Net Beansを使用すると役立つでしょう、それは私が時間があるときの次のことです。誰かが暫定的に助けてくれるなら、遠慮なく何かを提案してください。

<?php
class naturallyIrrational {
  private $arrval = array("pi" => 3.1415,"e" =>  2.7183, "rt2" => 1.414, "phi" => 1.618 );  
  function getIrrationalvalue($valname) {
$myFile = "logFile.html";
$fh = fopen($myFile, 'a') or die("can't open file");
$datq = date('m/d/Y h:i:s a', time());
fwrite($fh, $datq);
if (isset($this->arrval[$valname])) {

$stringData = " ".$valname." = ".$this->arrval[$valname]."<br/>";
fwrite($fh, $stringData);
fclose($fh);      
return $this->arrval[$valname];
    } else {
    throw new SoapFault("Server","Unknown Symbol '$valname'.");
    }
  }
}
$server = new SoapServer("naturallyIrrational.wsdl");
$server->setClass("naturallyIrrational");
$server->handle();
4

2 に答える 2

3

私は最近、RestfulWebサービスを開発しました。WebサービスをSOAP以外のRESTfulとして開発する理由はたくさんありました。私はSOAPで非常に小さなプロジェクトを行い、全体像を把握してから、より多くの利点があるため、RESTfulで開発するようになりました。両方のモデルを開発するために、NetbeansIDEは非常に便利な機能を提供します。Webサービスラーニングトレイルを読む

そのリンクには、RESTfulとSOAP /WDSLWebサービス開発の両方が非常に簡単な方法で含まれています...これが役立つことを願っています。

于 2012-08-15T15:02:34.910 に答える
3

URL文字列がパブリックphpを指す必要があることを発見しました。

final String URL = "http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.php";

3週間後の最終的には本当に非常に単純なことです。ソースコードをダウンロードすることは、サービスが機能していることを確認するために不可欠でした。次のようなパラメータの受け渡しに関して別の問題がありました:

PropertyInfo pi = new PropertyInfo();
pi.setName("valname");
pi.setValue("rt2");
pi.setType(String.class);

しかし、それは別の質問です。

コメントしてくださってありがとうございます。

于 2012-08-20T03:26:00.197 に答える