13

以下は、ユーザーログインの資格情報を検証するために作成したコードです。.netを使用して作成されたWebサービス

private static final String SOAP_ACTION = "http://tempuri.org/getCredentials";
private static final String OPERATION_NAME = "getCredentials";
private static final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";
private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/WebSiteName/CommunicationInterface.asmx"; 

SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME);
request.addProperty("username",Username);
request.addProperty("password", Password);

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

try
{
    httptransport.call(SOAP_ACTION, envelope);
SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
String value = result.toString();
value_LoginWS = value;
val = value;
login_status = Boolean.valueOf(result.toString());

Log.v("CS return value: -", result.toString());
return value;
}
catch (Exception e) 
{
     Log.v("Exception Soap" , e.toString());
}



並ん"httptransport.call(SOAP_ACTION, envelope)" で私はexception言うことを得る

"org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>
@1:7 in java.io.InputStreamReader@41afb3f0)" <br/><br/>

エラーが何であるかわかりません。このコードはエミュレーターで完全に機能します(を変更しますstaticIP to 10.0.2.2:portNo)。

この問題を解決するのを手伝ってください。

ありがとうございました。

4

4 に答える 4

61

以下のソリューションは、WCFWebサービスでテストおよび使用されています

このエラーが発生した場合

org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>
@1:7 in java.io.InputStreamReader@41afb3f0)"

次に、次の正しい値が提供されていないため、コードがWebサービスにアクセスできない可能性があります。

METHOD_NAME="";
NAMESPACE ="";      
SOAP_ACTION ="";
URL ="";

実行するこれらの基本的で重要な値を見つけるのに多くの苦労をしましたksoap2

METHOD_NAME="";
NAMESPACE ="";      
SOAP_ACTION ="";
URL ="";

この値の背後にある理論を実際に教えてくれたさまざまな例がありました。それは、賢明なSOAP_ACTION = NAMESPACE+METHOD_NAMEのようにそれらを生成する方法です。

そして、私は結果なしでさまざまな組み合わせを試し続けました。

WebServicesとKsoap2の経験がほとんどなく、ほとんどの場合JSONに悩まされていた私のような人は、実際にはイライラします。これらの値は一体何であり、正しく取得する方法です。

以下の手順を実行した後、これらの値を見つけるのが困難になることはありません。

Webサービスを実行します

1.Webサービス

このようなウィンドウが表示されます。

写真1のWebサービス

2. WSDL

次にWSDL、ピックでマークされたリンクをクリックしてファイルを開き、ファイルを確認します。WSDL

こんな感じになります。

写真2wsdl

3.Webサービスの名前空間を取得するには

Namespace次に、を使用して文字列""を検索しますCtrl+F

あなたはこのようなものを手に入れるでしょう

写真3名前空間

ここであなたは私たちが持っていることに気付くでしょうtwo namespaces

targetNamespace="http://tempuri.org/">
<wsdl:import namespace="iscservices.dedicated.co.za"

どちらを検討するかは、後で次の手順で確認します

どちらを使用するかは後でわかります

4.メソッド名とそれに対応するSoapActionを取得するには

"PutRecipeImagesPost"この場合、アクセスするメソッドを探します

写真4ソープアクション

この方法についてSOAP Actionもここにあります。

ここにあるように、私たちSoap action is NameSpace + Methodname はその使用法を見ることができる"iscservices.dedicated.co.za" ので、私たちと同じように完成させますnamespace

5.URLを取得するには

文字列を探す"soap:address location"

下の写真を参照してください

この属性の値はあなたのURLになります

したがって、最終的には必要なすべての値を取得します。

私たちの例による値

METHOD_NAME="PutRecipeImagesPost";
NAMESPACE ="iscservices.dedicated.co.za";       
SOAP_ACTION ="iscservices.dedicated.co.za/InterfaceiPhysioIntelWCFService/PutRecipeImagesPost";
URL ="http://10.0.2.2:51809/iPhysioIntelService.svc/second/";

上記のスナップショットを表示できない場合、またはこれらのスナップショットの値を取得できない場合は、を修正するWSDlように指示し てください。WebService deveoper

後でKSoap2の使用方法

以下のスニペットを参照してください

SoapObject req = new SoapObject(NAMESPACE,METHOD_NAME);
            //SoapObject req = new SoapObject(Namespace_Server,MethodName_Server);

    //req.addProperty(KEY, VALUE);
//Key : - parameter name that is there in URL of webservice
//value:- value we want to send to the parameter
    req.addProperty("ImageData", data);
    req.addProperty("login", CommonStaticData.getusername());
    req.addProperty("password",CommonStaticData.getpassword());
    req.addProperty("recipeId",FileID);

    MarshalBase64 mbase = new MarshalBase64();// marshal is used to serialize the byte array

    SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelop.bodyOut = req;
    envelop.encodingStyle = SoapSerializationEnvelope.ENC2001;
    envelop.dotNet = true;
    envelop.setOutputSoapObject(req);


    HttpTransportSE aht = new HttpTransportSE(URL);

    mbase.register(envelop);


    aht.call(SOAP_ACTION,envelop);
于 2013-06-06T07:42:57.213 に答える
6

@Azoneからの回答はさまざまに正しいですが、実際には、ksoapが次のように応答を返す場合

予想されるSTART_TAG{...}エンベロープ(position:START_TAG<{...}..。

それが使用するものとは異なる何かが必要であることを指します。

したがって、START_TAG"soapenv"に同じ名前空間ソースを使用する必要があります

ksoap2ライブラリはデフォルトの名前空間を使用します

 xmlns:v="http://www.w3.org/2003/05/soap-envelope" 

したがって、サーバーは同じソースを維持する必要があります

tornado-webservicesの例:

self._envelope.setAttribute ('xmlns:soapenv', 'http://www.w3.org/2003/05/soap-envelope')

または、ksoapをサーバーとして構成する必要がある他の方法

サーバ:

self._envelope.setAttribute ('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/') 

ksoap:

envelope.env = "http://schemas.xmlsoap.org/soap/envelope/";
于 2014-05-10T17:38:49.963 に答える
3

、、、の値を使用しNAMESPACE、 Azoneの回答で説明されているように、それでもエラーが発生する場合は、次のステートメントでSOAPのバージョンを確認してください。URLSOAP_ACTIONMETHOD_NAME

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VERXX);

私の場合、を使用していましたがSoapEnvelope.VER12、に戻すとSoapEnvelope.VER11エラーは解決しました。

WSDLからSOAPバージョンを見つける方法:

この答えからの引用:

SOAP 1.1は、名前空間http://schemas.xmlsoap.org/wsdl/soap/を使用します

SOAP1.2は名前空間http://schemas.xmlsoap.org/wsdl/soap12/を使用します

wsdlは、同じwsdlで同時にsoap1.1とsoap1.2での操作を定義できます。これは、soap 1.2を必要とする新しい機能(MTOMなど)をサポートするためにwsdlを進化させる必要がある場合に役立ちます。この場合、新しいサービスを作成する必要はなく、元のサービスを進化させるだけです。

于 2015-06-29T15:27:19.110 に答える
1

私が理解しているこの質問への答えは、SOAP_ADDRESS文字列で、/WebSiteName部分を削除することです。これは正常に機能します。私は自分のAndroidデバイスでこれをテストしました。完璧に動作します。

修正された文字列は次のようになります。

private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/CommunicationInterface.asmx";

ここで、CommunicationInterface.asmxはWebサービス名です。他の静的変数は同じままです。

注:これは、WebサイトがIISでホストされている場合に使用されます。

于 2012-09-15T14:07:04.107 に答える