以下は、ユーザーのログイン資格情報を検証するために作成したコードです。 .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
_の変更)。
この問題の解決を手伝ってください。
ありがとうございました。
私が理解しているこの質問に対する答えは、SOAP_ADDRESS文字列で、/ WebSiteNameの部分を削除することです。私はこれを私のAndroid=デバイスでテストしました。完全に動作します。
修正された文字列は次のようになります。
private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/CommunicationInterface.asmx";
ここで、CommunicationInterface.asmxはWebサービス名です。他の静的変数は同じままです。
注:これは、WebサイトがIISでホストされている場合に使用されます。
以下のソリューションがテストされ、使用されます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
このようなウィンドウが表示されます。
2。WSDL
WSDL
を確認するには、ピックでマークされたリンクをクリックしてWSDL
ファイルを開きます。
こんな感じになります。
.WebServiceの名前空間を取得するには
次に、Ctrl+F
を使用して文字列 "Namespace
"を検索します
あなたはこのようなものを得るでしょう
ここで、two namespaces
があることがわかります。
targetNamespace="http://tempuri.org/">
<wsdl:import namespace="iscservices.dedicated.co.za"
ここで、どちらを検討すればよいか、後で次の手順で確認します。
どちらを使用するかは後でわかります
4。メソッド名とそれに対応するSoapActionを取得するには
この場合、アクセスしたいメソッドを探します"PutRecipeImagesPost"
このメソッドには、ここにも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);
@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/";
Azoneの回答に記載されているようにNAMESPACE
、URL
、SOAP_ACTION
、METHOD_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を進化させる必要がある場合に役立ちます。この場合、新しいサービスを作成する必要はなく、元のサービスを進化させるだけです。