3

kSOAP2 を使用して Android で ColdFusion SOAP サービスを使用しようとすると、問題が発生します。これは、ColdFusion で記述したテスト メソッドを呼び出すための Java コードです (文字列のみを返します)。

private static final String NAMESPACE = "http://www.sub.tv/MyService.cfc?WSDL";
private static String URL = "http://www.sub.tv/MyService.cfc";
private static final String METHOD_NAME = "TestMethod";
private static final String SOAP_ACTION =  "http://www.sub.tv/MyService.cfc?method=TestMethod";

public void GetData() {

    SoapPrimitive resultstring = null;
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    PropertyInfo inputArgs = new PropertyInfo();
    inputArgs.setName("ID");
    inputArgs.setValue(1234);
    inputArgs.setType(Integer.class);
    request.addProperty(inputArgs);

    SoapSerializationEnvelope soapenvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    soapenvelope.dotNet = false;
    soapenvelope.setOutputSoapObject(request);    

    AndroidHttpTransport httptransport = new AndroidHttpTransport(URL);
    //httptransport.debug = true;

    try {
        httptransport.call(SOAP_ACTION, soapenvelope);
        resultstring = (SoapPrimitive) soapenvelope.getResponse();
    } catch (Exception e) {
        Log.d(DEBUG, e.getMessage());
    } 
}

そして、これが私が書いた文字列のみを返す ColdFusion テスト メソッドです。

    <cfcomponent displayname="test_web_service" namespace="http://www.sub.tv">
            <cffunction name="TestMethod" returnType = "string" access="remote" description="Test Method">
                    <cfargument name="ID" type="numeric">
                    <cfreturn "hello" />
            </cffunction>
    </cfcomponent>

上記の Java コードを実行すると発生するエラーは次のとおりです。

org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>@2:44 in java.io.InputStreamReader@40ff5440)  

問題の原因は、おそらく SOAP_ACTION で指定した URL にあるのではないかと思いますが、私の知る限り、それが ColdFusion SOAP Web サービス メソッドを呼び出す正しい方法です。ブラウザでその URL を実行すると、期待どおりの結果が返されます。その URL のクエリ文字列でメソッド呼び出しを除外しようとしましたが、それでも同じエラーが発生します。

どんな助けでも大歓迎です。

御時間ありがとうございます、

トニー

4

2 に答える 2

1

表示名と名前空間を削除してみてください。CFML を介して Web サービスを公開する場合、これらのどちらも必要ないことはわかっています。また、表示されていないエラーがあると思われます。エラーには次のものがあることに注意してください。

org.xmlpull.... (position:START_TAG <html> @2:44 in java.io.InputStreamReader@40ff5440)

その html タグは、Web サービスがエラーをスローしていることを示唆しています。CF がこれを行うと、HTML が出力されます。それを知って、ここにいくつかの提案があります。ブラウザから:

1) ブラウザで直接サービスにアクセスします: http://www.sub.tv/MyService.cfc . CF 管理者にログインし、CFC のドキュメントが表示されていることを確認します。

2) WSDL にアクセスします: http://www.sub.tv/MyService.cfc?wsdl。さまざまな機能が公開されているはずです。

3) テスト機能にアクセスします: http://www.sub.tv/MyService.cfc?method=TestMethod&id=123

実際、www.sub.tv は公開されており、MyService.cfc が利用可能であるため、上記のすべてをテストしましたが、CFC は良好で、エラーをスローしていないようです。

私はあなたの CFC の簡単なテストを行いました:

<cfset test = CreateObject("WebService", "http://www.sub.tv/MyService.cfc?WSDL") />

<cfdump var="#test.TestMethod(123)#" />

これは、Web サービスが正しく機能している場合に期待される "hello" を出力します。これは、Android から呼び出す方法に問題があることを示唆しています。私は Java で Web サービスを扱った経験があまりないので、ここでしか役に立ちません。

しかし、あなたの WSDL はテスト メソッドの引数を Double として定義していることに気付きました。数値型は任意の型の数値を保持できるため、これは CF では正常です。ただし、上記のコード例は次のことを示しています。

inputArgs.setType(Integer.class);  

それを Double.class に変更してみてください(または引数の型に一致するようにJavaでこれを変更してください。

それは私があなたのために持っているすべてです。幸運を!

于 2013-01-15T13:57:55.867 に答える
1

問題は、SOAP 経由で Web サービスを呼び出しているが、応答が期待される形式 (XML) ではないことだと思われます。Web サービス呼び出しhttp://www.sub.tv/MyService.cfc?method=TestMethod&id=123から生成された出力を見ると、次のようになります。

<wddxPacket version='1.0'>
    <header/>
    <data>
        <string>hello</string>
    </data>
</wddxPacket>

これは、デフォルトで、ColdFusion が XML を除くすべての戻り値の型 (単純な戻り値の型を含む) を WDDX 形式にシリアル化するためです... CFFunction のドキュメントはこちら

returnTypeColdFusion 関数で XML を指定してみて、それが機能するかどうかを確認してください。kSOAP期待どおりの結果を得るには、出力を微調整する必要があるかもしれません。必要な XML 形式はわかりませんが、これで始められるはずです。

CFFunctionを次のように変更します。

<cffunction name="TestMethod" returnType="xml" access="remote" description="Test Method">
    <cfargument name="ID" type="numeric">
    <cfset var xml = "">
    <cfxml variable="xml">
        <test>hello</test>
    </cfxml>
    <cfreturn xml>
</cffunction>
于 2013-01-15T14:21:38.280 に答える