6

Androidを使用してSOAPWebサービスを利用する必要があります。

問題は、特定の機能をリクエストする前に、基本的なhttpリクエストを使用してクライアントを認証する必要があることです。

KSOAPを使用してこれを行う方法を知っていますか?

この瞬間まで、http接続に追加のヘッダーを指定できることを示唆しているため、httpsTransportSE.call()のオーバーロードされたメソッドを使用してみました

(参照: https ://github.com/mosabua/ksoap2-android/blob/master/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java )

headerPropertyList.add(new HeaderProperty("Authorization", "Basic : dXNlcjpwYXNz"));

「cdXNlcjpwYXNz」は、「user:pass」のbase64でエンコードされた文字列です。

 public List call(String soapAction, SoapEnvelope envelope, List headers)
    * @param headers a list of HeaderProperties to be http header properties when establishing the connection



private static final String SOAP_ACTION = "someaddress/IPortReporting/GetPortStatus";
private static final String METHOD_NAME = "methodname";
private static final String NAMESPACE = "http://ssn.someaddress/2.0/";
private static final String URL = "new.someaddress/functionName.svc";




SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
        Request.addProperty("MessageId", "1");

        SoapSerializationEnvelope soapEnvelop = new SoapSerializationEnvelope(
                11);
        //soapEnvelop.headerOut = addHeaders(); 
        soapEnvelop.dotNet = true;
        soapEnvelop.setOutputSoapObject(Request);


        List<HeaderProperty> headerPropertieList = new ArrayList<HeaderProperty>();
        headerPropertyList.add(new HeaderProperty("Authorization", "Basic : cG9ydHdzOjEyM3F3ZUFTRA=="));
        //HeaderProperty headerProperty = new HeaderProperty()

        HttpsTransportSE httpsse = new HttpsTransportSE(URL, 443, "", 5000);



        try {
            httpsse.call(SOAP_ACTION, soapEnvelop, headerPropertyList);
            //httpsse.call(SOAP_ACTION, soapEnvelop);

            SoapPrimitive resultString = (SoapPrimitive) soapEnvelop
                    .getResponse();
            tv.setText("Status: ");
        } catch (Exception e) {
            tv.setText("Some error," + " "
                    + e.getMessage());
        }

しかし、「許可が拒否されました」というメッセージが報告されました。

4

6 に答える 6

12

これを試して。これは私にとってはうまくいき、Androidアプリケーションから.Netサービスを消費しました。ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar を使用しました

String NAMESPACE = "http://www.namespace.com/";
String METHOD_NAME = "MethodName";
String SOAP_ACTION = "http://www.namespace.com/MethodName";
String URL = "https://www.namespace.com/services/Service.asmx";

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
// Set all input params   
request.addProperty("property", "value");   
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
// Enable the below property if consuming .Net service
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
 
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {

    List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
    headerList.add(new HeaderProperty("Authorization", "Basic " + 
        org.kobjects.base64.Base64.encode("username:password".getBytes())));

    androidHttpTransport.call(SOAP_ACTION, envelope, headerList);
    SoapObject response = (SoapObject)envelope.getResponse();
    //response.getProperty(0).toString();

} catch(Exception e) {
     e.printStackTrace();
}
于 2011-09-27T22:29:59.873 に答える
4

これへのリンクされた質問では、HeaderProperty の 2 番目の引数にコロンが含まれていません。「Basic dXNlcjpwYXNz」になります。それが問題なのでしょうか? (どちらが正しいですか?)

于 2011-06-01T18:00:24.470 に答える
2

ほとんどの場合、Androidマニフェストファイルに次のものを含める必要があります。

<uses-permission android:name="android.permission.INTERNET" />
于 2011-03-20T17:06:11.437 に答える
2

これを参照してください。Android アプリケーションからローカル SOAP Web サービス (.asmx) を呼び出す簡単なコードを実装しました。

ユーザー名とパスワードを使用してユーザーを認証する単純な Web サービスです。

それが役立つことを願っています

乾杯

于 2011-11-24T04:15:41.870 に答える
1

HttpTranspostBasicAuth を試しましたか?

参照情報は次のとおりです。 http://ksoap2.sourceforge.net/doc/api/org/ksoap2/transport/HttpTransportBasicAuth.html

于 2011-07-13T18:26:50.950 に答える
0

この作品のみ https://stackoverflow.com/a/5614243/7198554 ....

soapEnvelope.headerOut = new Element[1];

this ->SoapSerializationEnvelope envelope 名前空間 this -> http://tempuri.org/ my code=>

public Element buildAuthHeader() {
Element h = new Element().createElement(NAMESPACE, "AuthHeader");
Element username = new Element().createElement(NAMESPACE, "Username");
username.addChild(Node.TEXT, "test");
h.addChild(Node.ELEMENT, username);
// Element pass = new Element().createElement(NAMESPACE, "pass");
// pass.addChild(Node.TEXT, pass);
// h.addChild(Node.ELEMENT, pass);
return h;

VS C# で

public class AuthHeader : SoapHeader
{
public string Username;
//public string Password;
}
于 2016-11-23T07:22:43.507 に答える