Bonjour,

J'essaie de consommer une requête SOAP depuis mon application Android et je rencontre divers difficulté.
J'utilise la librairie Ksoap2 pour ce faire. voici mon code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class WebServiceCall {
 
    private static final String TAG = WebServiceCall.class.getSimpleName();
 
    public static String callWSThreadSoapPrimitive(String strURL, String strSoapAction, SoapObject request) {
 
 
        try {
            StringBuffer result;
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.setOutputSoapObject(request);
            HttpTransportSE ht = new HttpTransportSE(strURL);
            ht.debug = true;
            ht.call(strSoapAction, envelope);
            SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
 
            result = new StringBuffer(response.toString());
            Log.i(TAG, "result: " + result.toString());
            return result.toString();
 
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
 
 
    }
}

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class GetArticleTask extends AsyncTask<String, Void, String> {
 
    private MainActivity activity;
    private String soapAction;
    private String methodName;
    private String paramsName;
 
    private final static String TAG = GetArticleTask.class.getSimpleName();
 
    public GetArticleTask(MainActivity activity, String soapAction, String methodName,
                                  String paramsName) {
        this.activity = activity;
        this.methodName = methodName;
        this.soapAction = soapAction;
        this.paramsName = paramsName;
    }
 
    @Override
    protected String doInBackground(String... params) {
        //create a new soap request object
        SoapObject request = new SoapObject(ConstantString.NAME_SPACE, methodName);
        //add properties for soap object
        request.addProperty(paramsName, params[0]);
 
        //request to server and get Soap Primitive response
        return WebServiceCall.callWSThreadSoapPrimitive(ConstantString.URL, soapAction, request);
    }
 
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (result == null) {
            Log.i(TAG, "cannot get result");
        } else {
            //invoke call back method of Activity
            activity.callBackDataFromAsyncTask(result);
        }
    }
 
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
public class ConstantString {
 
    public final static String SOAP_ACTION = "https://xxx.xxx.xxx.xxx:1443/orawsv/TESTRC/WSS_MWEB_CLI/";
    public final static String NAME_SPACE = "https://xxx.xxx.xxx.xxx:1443/orawsv/TESTRC/WSS_MWEB_CLI/";
 
    public final static String URL ="https://xxx.xxx.xxx.xxx:1443/orawsv/TESTRC/WSS_MWEB_CLI/GETARTICLE";
 
    public final static String GET_ARTICLE_METHOD_NAME = "GETARTICLE";
    public final static String GET_ARTICLE_SOAP_ACTION = SOAP_ACTION + GET_ARTICLE_METHOD_NAME;
 
 
}
mon activity:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class MainActivity extends Activity {
 
    private TextView textConverted;
    private View btnGetArticle;
    private EditText input;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        btnGetArticle = (View) findViewById(R.id.btn);
        textConverted = (TextView) findViewById(R.id.txt_converted);
        input = (EditText) findViewById(R.id.txt_temp);
 
        // set event listeners
        btnGetArticle.setOnClickListener(onFtoCClick());
    }
 
    //change Fahrenheit to Celsius degree
    private OnClickListener onFtoCClick() {
        return new OnClickListener() {
 
            @Override
            public void onClick(View v) {
                invokeAsyncTask("Article", ConstantString.GET_ARTICLE_SOAP_ACTION,
                        ConstantString.GET_ARTICLE_METHOD_NAME);
            }
        };
    }
 
    //create and execute asynctask to get response from W3school server
    private void invokeAsyncTask(String convertParams, String soapAction, String methodName) {
        new GetArticleTask(this, soapAction, methodName, convertParams).execute(input.getText()
                .toString().trim());
    }
 
    //call back data from background thread and set to views
    public void callBackDataFromAsyncTask(String result) {
 
        textConverted.setText(result);
 
 
    }
}
Lorsque je clique sur le bouton pour tester la requête j'ai le message:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
07-10 08:52:17.852 702-754/com.ablinfo.mweb W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
07-10 08:52:17.857 702-754/com.ablinfo.mweb W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328)
        at com.android.okhttp.internal.http.SocketConnector.connectTls(SocketConnector.java:103)
        at com.android.okhttp.Connection.connect(Connection.java:143)
        at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:185)
        at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
        at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:342)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:331)
07-10 08:52:17.858 702-754/com.ablinfo.mweb W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:249)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245)
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
        at org.ksoap2.transport.ServiceConnectionSE.openOutputStream(ServiceConnectionSE.java:130)
        at org.ksoap2.transport.HttpTransportSE.sendData(HttpTransportSE.java:292)
        at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:184)
        at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
        at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
        at com.ablinfo.mweb.service.WebServiceCall.callWSThreadSoapPrimitive(WebServiceCall.java:29)
        at com.ablinfo.mweb.service.GetArticleTask.doInBackground(GetArticleTask.java:36)
        at com.ablinfo.mweb.service.GetArticleTask.doInBackground(GetArticleTask.java:11)
        at android.os.AsyncTask$2.call(AsyncTask.java:295)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
    	Suppressed: javax.net.ssl.SSLHandshakeException: Handshake failed
J'ai l'impression que c'est à cause du certificat SSL. Mais je sais pas comment contourner ce problème.

D'avance merci.