ksoap2-androidを使用して、SOAP要求に基本認証を追加します

仕事の一環として、プロジェクトに連絡してAndroidと1Cを通信するためのアプリケーションを開発しました。 インターネットで簡単に検索すると、完成したプログラムですぐに形になった非常に明確な指示とコードの断片が得られましたが、実行したくありませんでした。 ここでは、主な微妙さとそれらを解決する方法について説明します。



ソースコードはここここに描かています 。 サードパーティのksoap2-androidライブラリを接続するだけで、SoapObjectクラスとHttpTransportSEクラスが使用可能になります。 何らかの理由で、 公式リポジトリからjarをダウンロードしてapp / libsに入れる古い実績のある方法は失敗し、現代のGradleを使用してライブラリを接続する方法を検討し始めました。 ほぼすべてのリソースに書かれており、単純な追加



dependencies { compile 'com.google.code.ksoap2-android:ksoap2-android:3.6.1' }
      
      





必要なリソースを「プルアップ」する必要があります。 しかし、これは起こりませんでした、なぜなら リソース自体は標準リポジトリにはありません。 そのため、ダウンロードする場所を指定する必要があります。 これを行うには、Gradleプロジェクトファイルに次の行を追加します。



 buildTypes { repositories { maven { url 'https://oss.sonatype.org/content/repositories/ksoap2-android-releases' } } }
      
      





これらの簡単な手順の後、プロジェクトを同期するだけで、Gradleは必要なものをすべてダウンロードします。

上記の手順の後に動作を開始するコードは次のとおりです。



 public class DataLoader extends AsyncTask<Void, Void, String> { private static final String NAMESPACE = "namespace"; private static final String URL = "http://host/wsdlAcceptor?wsdl"; private static final String SOAP_ACTION = "http://host/wsdlAcceptor"; private static final String METHOD_NAME = "testOperation"; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(Void... params) { try { SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10); request.addProperty("IsFirstRequest", true); envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.debug = true; try { androidHttpTransport.call(SOAP_ACTION, envelope); SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn; System.out.println("Response::"+resultsRequestSOAP.toString()); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } return ""; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); } }
      
      





ネットワークアクティビティの処理を別の非同期タスクから実行する必要があるのは秘密ではありません。 doInBackgroundは、標準のAsyncTaskメソッドです。 あなたが精通していない場合、 ここで彼について簡単かつ非常に明確に書かれています。



MainActivity自体は次のとおりです。



 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DataLoader dl = new DataLoader(); dl.execute(); } }
      
      





冒険はそこで終わりません。 私の場合、サーバーへの要求は基本認証によって閉じられたため、ログインとパスワードをどこかに入力する必要がありました。 そして、私はインターネットでこの質問に対する明確な答えを見つけられませんでした。 多くの記事では、特定のクラスHttpTransportBasicAuthSEに言及しており、コンストラクターにパスワード付きのログインが渡されます。 しかし、それはksoap2-androidには見つかりませんでした。インターネットで調べなければなりませんでした。 ここにあります 。 全文を引用します。



 public class HttpTransportBasicAuthSE extends HttpTransportSE { private String username; private String password; /** * Constructor with username and password * * @param url * The url address of the webservice endpoint * @param username * Username for the Basic Authentication challenge RFC 2617 * @param password * Password for the Basic Authentication challenge RFC 2617 */ public HttpTransportBasicAuthSE(String url, String username, String password) { super(url); this.username = username; this.password = password; } public ServiceConnection getServiceConnection() throws IOException { ServiceConnectionSE midpConnection = new ServiceConnectionSE(url); addBasicAuthentication(midpConnection); return midpConnection; } protected void addBasicAuthentication(ServiceConnection midpConnection) throws IOException { if (username != null && password != null) { StringBuffer buf = new StringBuffer(username); buf.append(':').append(password); byte[] raw = buf.toString().getBytes(); buf.setLength(0); buf.append("Basic "); org.kobjects.base64.Base64.encode(raw, 0, raw.length, buf); midpConnection.setRequestProperty("Authorization", buf.toString()); } } }
      
      





コードコメントは不要だと思います。 HttpTransportBasicAuthSEを適用するには、DataLoaderの行を変更するだけで十分であることを明確にします。



 HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
      
      









 HttpTransportBasicAuthSE androidHttpTransport = new HttpTransportBasicAuthSE(URL, "basicLogin", "authPassword");
      
      





そしてすべてが非常に明確に認可で動作し始めます!



PS:マニフェストにインターネット許可を追加することを忘れないでください



 <uses-permission android:name="android.permission.INTERNET" />
      
      






All Articles