2017-03-29 4 views
2

私はアンドロイドデバイスでsoap webserviceを呼び出す必要があります。私はstackoverflowや他のページでビデオを見ている記事をたくさん読んでいます...しかし、私はeverythinを試して、私はそれが私のアンドロイドデバイスで動作させることはできません、と私はエミュレータでテストすることはできません、私のコンピュータはそれらのどれも扱うことができないので、エラーがコード上にあるのか、それとも私のアンドロイドデバイスの問題なのか分かりません。androidのsoap webserviceを呼び出してください

レイアウトXMLは、EditText、Button、およびTextViewのみです。

あなたは、私がWebサービスに送信する必要がある要求XMLを見ることができます。このリンクで

(私はSOAP 1.1またはSOAP 1.2を使用する必要がありますか?) http://www.webservicex.net/globalweather.asmx?op=GetCitiesByCountry

これは私の実際のコードである、と私は他の多くの方法を試してみました誰も私のために働いていません。どんな助け? (URL、名前空間、soap_actionとMETHOD_NAME値はオーケーです、そうでない?)

package com.example.doazdoas.webservice_prueba; 


    import android.app.Activity; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.TextView; 

    import org.ksoap2.SoapEnvelope; 
    import org.ksoap2.serialization.SoapObject; 
    import org.ksoap2.serialization.SoapSerializationEnvelope; 
    import org.ksoap2.transport.HttpTransportSE; 

    import android.os.AsyncTask; 
    import android.widget.Toast; 

    import static android.content.ContentValues.TAG; 

    public class MainActivity extends Activity{ 
    private TextView textResult; 
    private Button buttonSend; 

    String NAMESPACE = "http://www.webserviceX.NET/"; 
    String METHOD_NAME = "GetCitiesByCountry"; 
    String SOAP_ACTION = NAMESPACE + METHOD_NAME; 
    String URL = "http://www.webservicex.net/globalweather.asmx?WSDL"; 

    private Object resultsRequestSOAP = null; 

    HttpTransportSE androidHttpTransport; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     textResult = (TextView)findViewById(R.id.textResultado); 
     buttonSend = (Button)findViewById(R.id.buttonEnviar); 
     //setContentView(tv); 
    } 

    public void onClickEnviar(View view){ 
     AsyncCallWS task = new AsyncCallWS(); 
     task.execute(); 
    } 

    private class AsyncCallWS extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      Log.i(TAG, "onPreExecute"); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      Log.i(TAG, "doInBackground"); 
      sendRequest(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      Log.i(TAG, "onPostExecute"); 
      Log.d("dump Request: " ,androidHttpTransport.requestDump); 
      Log.d("dump response: " ,androidHttpTransport.responseDump); 
     } 

    } 


    public void sendRequest(){ 
     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 


     //SoapObject 
     request.addProperty("@CountryName", "SPAIN"); 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.setOutputSoapObject(request); 


     androidHttpTransport = new HttpTransportSE(URL); 
     try 
     { 
      androidHttpTransport.call(SOAP_ACTION, envelope); 
      resultsRequestSOAP = envelope.getResponse(); 
      String[] results = (String[]) resultsRequestSOAP; 
      textResult.setText(results[0]); 
     } 
     catch (Exception aE) 
     { 
      aE.printStackTrace(); 
     } 
    } 
} 
+0

'NAMESPACE'の最後に向かって '/'を取り除き、' SOAP_ACTION = NAMESPACE + "/" + METHOD_NAME;を変更してみてください – DaveNOTDavid

答えて

0

あなたはdoInBackGroundに任意のUI関連の操作を行い、だから、onPostExecute methnodにそれらを移動することができます。

doInBackGroundはUIスレッドではないためです。 AsyncTaskドキュメントを注意深くお読みください。 doInBackGroundから返されるデータは何でも、それはonPostExecuteへの入力とみなされます。

次のように

private class AsyncCallWS extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     Log.i(TAG, "onPreExecute"); 
    } 

    @Override 
    protected String[] doInBackground(Void... params) { 
     Log.i(TAG, "doInBackground"); 
     String[] data = sendRequest(); 
     return data; 
    } 

    @Override 
    protected void onPostExecute(String[] result) { 
     Log.i(TAG, "onPostExecute"); 
     if(result != null && result.length > 0){ 
      textResult.setText(results[0]); 
     } 
    } 

} 


private String[] sendRequest(){ 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 


    //SoapObject 
    request.addProperty("@CountryName", "SPAIN"); 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.setOutputSoapObject(request); 


    androidHttpTransport = new HttpTransportSE(URL); 
    try 
    { 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
     resultsRequestSOAP = envelope.getResponse(); 
     String[] results = (String[]) resultsRequestSOAP; 
    } 
    catch (Exception aE) 
    { 
     aE.printStackTrace(); 
    } 
} 
+0

doInBackground()メソッドはString []型データ –

+0

次に、ArrayListを生成し、doInBackGroundからArrayListを返します。 – Rohit

+0

コードを送信できますか?私はエラーなしでそれを書くことができません –

0

プライベートクラスAsyncCallWSがAsyncTask {

private String[] data; 
    @Override 
    protected void onPreExecute() { 
     Log.i(TAG, "onPreExecute"); 
    } 

    @Override 
    protected String[] doInBackground(Void... params) { 
     Log.i(TAG, "doInBackground"); 
     data = sendRequest(); 
     return data; 
    } 

    @Override 
    protected void onPostExecute(String[] result) { 
     Log.i(TAG, "onPostExecute"); 
     if(result != null && result.length > 0){ 
      Log.d("dump Request: " ,androidHttpTransport.requestDump); 
      Log.d("dump response: " ,androidHttpTransport.responseDump); 
      textResult.setText(result[0]); 
     }else{ 
      Log.d("Error","There's no answer"); 
     } 
    } 

} 

を拡張し、私はそれを変更し、現在はこのようなものです...しかし、それは常に何も答えはありませんことを印刷し、あなたのコードを変更します

0

ライブラリを使用せずに石鹸リクエストを行うことを検討しましたか?私は以前にも同じ問題を抱えていました。それは、特に要求の構造を変更する場合に、ライブラリがあなたの仕事をより困難にさせることに気付きました。これは、ライブラリを使用せずにSOAPリクエストを作成する方法です。 まず、WindowsアプリケーションであるSOAP Uiを使用する方法を知る必要があります。ここでwsdlファイルをインポートすることができます。構文が正しい場合は、Webサービスのリクエスト本文を示す画面が表示されます。テスト値を入力すると、応答構造が得られます。このリンクは、Androidのコードに今すぐに石鹸UI https://www.soapui.org/soap-and-wsdl/working-with-wsdls.html

の使用方法についてご案内します。

私たちは、非同期タスクを拡張runTaskという名前のクラスを作成し、リクエストボディを送信し、要求応答を取得するためにHTTPを使用します:

private class runTask extends AsyncTask<String, String, String> { 

     private String response; 
     String string = "your string parameter" 
     String SOAP_ACTION = "your soap action here"; 

     String stringUrl = "http://your_url_here"; 
     //if you experience a problem with url remove the '?wsdl' ending 



     @Override 
     protected String doInBackground(String... params) { 

      try { 

         //paste your request structure here as the String body(copy it exactly as it is in soap ui) 
         //assuming that this is your request body 


       String body = "<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">" + 
           "<soap:Body>"+ 
           "<GetCitiesByCountryResponse xmlns="http://www.webserviceX.NET">"+ 
           "<GetCitiesByCountryResult>"+string+"</GetCitiesByCountryResult>"+ 
           "</GetCitiesByCountryResponse>"+ 
           "</soap:Body>"+ 
           "</soap:Envelope>"; 


       try { 
        URL url = new URL(stringUrl); 
        HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
        conn.setRequestMethod("POST"); 
        conn.setDoOutput(true); 
        conn.setDefaultUseCaches(false); 
        conn.setRequestProperty("Accept", "text/xml"); 
        conn.setRequestProperty("SOAPAction", SOAP_ACTION); 

        //push the request to the server address 

        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
        wr.write(body); 
        wr.flush(); 

        //get the server response 

        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
        StringBuilder builder = new StringBuilder(); 
        String line = null; 

        while ((line = reader.readLine()) != null) { 


         builder.append(line); 
         response = builder.toString();//this is the response, parse it in onPostExecute 

        } 


       } catch (Exception e) { 

        e.printStackTrace(); 
       } finally { 

        try { 

         reader.close(); 
        } catch (Exception e) { 

         e.printStackTrace(); 
        } 
       } 


      } catch (Exception e) { 

       e.printStackTrace(); 
      } 

      return response; 
     } 

     /** 
     * @see AsyncTask#onPostExecute(Object) 
     */ 
     @Override 
     protected void onPostExecute(String result) { 



      try { 

       Toast.makeText(this,"Response "+ result,Toast.LENGTH_LONG).show(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

今だけクラスを実行し、魔法が起こるのを見る:

runTask runner = new runTask(); 
runner.execute(); 

あなたはDOMを使用して応答を解析することができますかSAXパーサーを使用して目的の値を取得します。 詳細をお気軽にお尋ねください。

関連する問題