web-dev-qa-db-ja.com

ksoap2 org.xmlpull.v1.xmlpullparserexceptionで予期されるstart_tagエラー

以下は、ユーザーのログイン資格情報を検証するために作成したコードです。 .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_の変更)。

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

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

13
cham

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

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

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

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

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

1
cham

以下のソリューションがテストされ、使用されますWCF Webサービス

これを取得している場合エラー

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でほとんどの場合、実際にイライラする人、これらの値が一体何であり、それらを正しく取得する方法については。

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

WebServiceを実行する

1。WebService

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

Picture 1 webservice

2。WSDL

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

こんな感じになります。

picture 2 wsdl

.WebServiceの名前空間を取得するには

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

あなたはこのようなものを得るでしょう

picture 3 namespace

ここで、two namespacesがあることがわかります。

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

ここで、どちらを検討すればよいか、後で次の手順で確認します。

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

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

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

Picture 4 Soap Action

このメソッドには、ここにもSOAP Actionがあることがわかります。

Soap action is NameSpace + Methodnameのように、ここで"iscservices.dedicated.co.za"の使用を確認できるため、namespaceと同じようにファイナライズします

5。URLを取得するには

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

see the picture below

この属性の値は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);
60
DeltaCap019

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

予想されるSTART_TAG {...}封筒(位置: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/";
6
RTOSkit

Azoneの回答に記載されているようにNAMESPACEURLSOAP_ACTIONMETHOD_NAMEの値を使用したにもかかわらず、エラーが発生する場合は、このステートメントのSOAPのバージョン:

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VERXX);

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

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

この答え からの引用:

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

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

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

3
Solace