Androidで標準のSOAP/WSDL Webサービスを呼び出す方法に関する優れた情報を見つけるのに非常に苦労しています。私が見つけることができたのは、非常に複雑なドキュメントと "kSoap2"への参照、そして _ sax _ を使ってそれを手動でパースすることです。それでいいのですが、それは2008年なので、標準のWebサービスを呼び出すための良いライブラリがあるはずです。
Webサービスは基本的に NetBeans で作成されたものです。配管クラスを生成するためのIDEサポートを希望します。私は、Androidベースの電話から _ wsdl _ ベースのWebサービスに連絡するための最も簡単で最もエレガントな方法が必要です。
AndroidはSOAPライブラリを提供していません。自分で書くか、 kSOAP 2 のようなものを使うことができます。ご存知のように、他の人が自分のプロジェクトでkSOAP2をコンパイルして使用することができましたが、私はそうする必要はありませんでした。
Googleはこれまで、AndroidにSOAPライブラリを追加することにほとんど関心を示していません。これに対する私の疑いは、彼らがWebサービスにおけるRESTベースのサービスへの現在の傾向を支持し、データのカプセル化フォーマットとしてJSONを使用することをむしろ支持するということです。または、メッセージングにXMPPを使用する。しかし、それは単なる推測です。
現時点では、XMLベースのWebサービスは、Android上ではやや自明ではありません。 NetBeansを知らないで、私はそこで利用可能なツールに話すことができません、しかし私はより良いライブラリが利用可能であるべきであることに同意します。 XmlPullParserを使用するとSAXを使用しなくて済む可能性がありますが、そのことについてはあまり詳しくありません。
org.Apache.http.impl.client.DefaultHttpClient
はデフォルトでAndroid SDKに入っています。これでWSDLに接続できます。
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);
オーバーヘッドがあるため、SOAPはモバイルデバイスとのデータ交換には最適な選択肢ではありません。ただし、サーバー出力の形式を制御していない状況では、気付くことがあります。
あなたがSOAPを使い続ける必要があるのであれば、ここにAndroid用にパッチを当てられたkSOAP2ライブラリがあります。
http://code.google.com/p/ksoap2-Android/
モバイルデバイス(特にAndroid携帯電話)からWebサービスを呼び出すために、私はそれをするために非常に簡単な方法を使いました。 Webサービスを呼び出すためにWebサービスクライアントAPIを使用していません。私のアプローチは次の通りです。
HttpURLConnection
を使用して単純なHTTP接続を作成します。getResonseCode
を使用しました)。ErrorInput
ストリームを受け取り、もしあればエラーを受け取ります。私はAndroid携帯電話のためにこの手順を実行しました、そして、それは首尾よく走っています。 700 KBを超えてもレスポンスを解析できます。
SOAPは、処理/解析のオーバーヘッドが必要なため、Android(または一般的なモバイルデバイス)での使用には適していません。 RESTサービスはより軽量のソリューションであり、それが私が提案するものです。 AndroidにはSAXパーサーが付属していますが、使用するのはかなり簡単です。モバイルデバイスでSOAPを処理/解析することが絶対に必要な場合は、申し訳ありませんが、SOAPを使用しないことをお勧めします。
約1年前、私はこのスレッドを読んでSOAPを呼び出してAndroidを呼び出しました-HttpClientを使用して自分で構築する提案は、自分で構築することになりましたSOAPAndroid用ライブラリ:
基本的に、単純なJavaAPIを介して送信するエンベロープを構築し、XPathを介して定義するオブジェクトに自動的に解析することができます。次に例を示します。
<Dictionary>
<Id></Id>
<Name></Name>
</Dictionary>
になる:
@XMLObject("//Dictionary")
public class Dictionary {
@XMLField("Id")
private String id;
@XMLField("Name")
private String name;
}
私は自分のプロジェクトにそれを使用していましたが、他の人に役立つかもしれないと考えたので、それを分離して文書化するのに少し時間を費やしました。 「SOAP Android」をググリングしながらこのスレッドでつまずいたあなたの貧しい魂の何人かがそれを試して利益を得ることができれば、私は本当にそれが大好きです。
プロジェクトにksoap2.jarを追加したり、AndroidManifestファイルにインターネット権限を追加したりすることを忘れないでください。
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import Android.app.Activity;
import Android.os.Bundle;
import Android.widget.TextView;
public class WebserviceActivity extends Activity {
private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl";
private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
private static final String METHOD_NAME = "AuthenticateTest";
private TextView lblResult;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lblResult = (TextView) findViewById(R.id.tv);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("name","44vmMAYrhjfhj66fhJN");
request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
//SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
// SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;
lblResult.setText(resultsRequestSOAP.toString());
System.out.println("Response::"+resultsRequestSOAP.toString());
} catch (Exception e) {
System.out.println("Error"+e);
}
}
}
私はKSOAPを試してみました。私はもっと簡単な方法を選びました。
WSDLファイルを指定して、各リクエストに対してSOAPリクエストテンプレートを作成し(例:SOAP UIを使用)、コードに渡す値を代入します。 DefaultHttpClientインスタンスを使用してPOSTこのデータをサービスエンドポイントに送信し、応答ストリームを取得します。 XMLプルパーサーを使用して応答ストリームを解析します。
NSClient ++ をご覧ください。
私はAndroidプラットフォーム用の新しいSOAPクライアントを作成しました。 JAX-WSが生成したインターフェースを使用していますが、これは概念実証に過ぎません。
興味のある方は、例を試してみるか、 AndroidSOAP でソースを見てください。
可能であれば、JSONに行きます。 Androidには完全なorg.jsonパッケージが付属しています
ksoap2 methodsを呼び出します。それはとてもうまくいきます。
詳細を設定します。
private static String mNAMESPACE=null;
private static String mURL=null;
public static Context context=null;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(Request);
envelope.addMapping(mNAMESPACE, "UserCredentials",new UserCredendtials().getClass());
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(mURL);
そして結果を得るために
androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();
AndroidからWebサービスを呼び出すとが役立ちます。
数か月前、私はj2eeアプリケーションでjax-ws Webサービスを使用していました。そこで、WSDLファイルからWSクライアントスタブを生成するために CXF wsdl2Java を使用し、それらのWebサービスを使用しました。数週間前、Androidプラットフォームで同じ方法でWebサービスを利用しようとしたときに、Android jarにすべての "jax-ws"サポートクラスが含まれていなかったため、できませんでした。その時私は自分の要求を満たすのにそのような道具を(私が効率的にグーグルに失敗しなかったならば)見つけなかった -
だから、私は自分で開発した Android SOAPクライアント生成ツール 。次の手順に従う必要がある場所
例えば:
ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();
SomeComplexRequest request = --Get some complex request----;
SomeComplexResp resp = port.operate( request );
私はAndroidアプリケーションからSOAP Webサービスを呼び出すを使用すると役に立ちます。
私にとって最も簡単な方法は、必要なすべてのクラスを生成するための優れたツールを使用することです。個人的に私はこのサイトを使います:
これは非常に複雑なWebサービスをサポートし、ksoap2を使用しています。
メソッドSOAPで次の手順に従います。
WSDLファイルから、
リクエストごとにSOAPリクエストテンプレートを作成します。
それからコードで渡される値を代入します。
DefaultHttpClientインスタンスを使用して、このデータをサービスエンドポイントにPOSTします。
レスポンスストリームを取得して最後に
XMLプルパーサーを使用して応答ストリームを解析します。
JSONを使用できる場合は、PHPサーバーとAndroid Phoneクライアントを使用したアプリケーションサービスの開発に、ホワイトペーパー、ビデオ、およびsample.codeがあります。
私は非常に役に立ちました非常に便利なツールをチェックアウトすることをお勧めします。そのプロジェクトの面倒をみてくれた人たちもとても役に立ちました。 www.wsdl2code.com/
あなたがAndroidでWebサービスを呼び出すことに関して問題を抱えているなら、あなたはWebサービスを呼び出して応答を得るために以下のコードを使うことができます。 Webサービスが データテーブルフォーマット ..で応答を返すことを確認してください。このコードは、 SQL Server databaseのデータを使用する場合に役立ちます。 _ mysql _ を使用する場合は、Wordの代わりに1つ変更する必要があります NewDataSet からobj2=(SoapObject) obj1.getProperty("NewDataSet");
を DocumentElement から
void callWebService(){
private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name i.e http://package_name
private static final String URL = "http://localhost/sample/services/MyService?wsdl";
// you can use IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = "urn:" + METHOD_NAME;
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("parm_name", prm_value);// Parameter for Method
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;// **If your Webservice in .net otherwise remove it**
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);// call the eb service
// Method
} catch (Exception e) {
e.printStackTrace();
}
// Next task is to get Response and format that response
SoapObject obj, obj1, obj2, obj3;
obj = (SoapObject) envelope.getResponse();
obj1 = (SoapObject) obj.getProperty("diffgram");
obj2 = (SoapObject) obj1.getProperty("NewDataSet");
for (int i = 0; i < obj2.getPropertyCount(); i++) {
// the method getPropertyCount() and return the number of rows
obj3 = (SoapObject) obj2.getProperty(i);
obj3.getProperty(0).toString();// value of column 1
obj3.getProperty(1).toString();// value of column 2
// like that you will get value from each column
}
}
これに関して何か問題があれば私に書いてもいいです。
これはAndroidでSOAP Webサービスを利用する実際の例です。
** Note :: ***あなたのプロジェクトにksoap2.jarを追加することを忘れずに、またAndroidManifestファイルにINTERNETパーミッションを追加してください*
public final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";
public final String METHOD_NAME = "FahrenheitToCelsius";
public final String PROPERTY_NAME = "Fahrenheit";
public final String SOAP_ACTION = "http://tempuri.org/FahrenheitToCelsius";
public final String SOAP_ADDRESS = "http://www.w3schools.com/webservices/tempconvert.asmx";
private class TestAsynk extends AsyncTask<String, Void, String> {
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Toast.makeText(getApplicationContext(),
String.format("%.2f", Float.parseFloat(result)),
Toast.LENGTH_SHORT).show();
}
@Override
protected String doInBackground(String... params) {
SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
METHOD_NAME);
request.addProperty(PROPERTY_NAME, params[0]);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(
SOAP_ADDRESS);
Object response = null;
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
response = envelope.getResponse();
Log.e("Object response", response.toString());
} catch (Exception e) {
e.printStackTrace();
}
return response.toString();
}
}
プロジェクトのSOAPライブラリファイルをダウンロードして追加してくださいファイル名: ksoap2-Android-Assembly-3.4.0-jar-with-dependencies
アプリケーションをクリーンにしてからプログラムを起動します
これはSOAPサービス呼び出しのコードです。
String SOAP_ACTION = "YOUR_ACTION_NAME";
String METHOD_NAME = "YOUR_METHOD_NAME";
String NAMESPACE = "YOUR_NAME_SPACE";
String URL = "YOUR_URL";
SoapPrimitive resultString = null;
try {
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
addPropertyForSOAP(Request);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(Request);
HttpTransportSE transport = new HttpTransportSE(URL);
transport.call(SOAP_ACTION, soapEnvelope);
resultString = (SoapPrimitive) soapEnvelope.getResponse();
Log.i("SOAP Result", "Result Celsius: " + resultString);
} catch (Exception ex) {
Log.e("SOAP Result", "Error: " + ex.getMessage());
}
if(resultString != null) {
return resultString.toString();
}
else{
return "error";
}
結果はJSONObjectまたはJSONArrayまたはStringです。
より良い参照のために、 https://trinitytuts.com/load- data-from-soap-web-service-in-Android-application/
ありがとう。
あなたは特定のヘッダを使ってhttpでpostとしてsoap callを実行することができます。私はksoap2のような追加のライブラリなしでこの問題を解決しましたこれはsoapサービスから注文を受けているライブコードです。
private static HashMap<String,String> mHeaders = new HashMap<>();
static {
mHeaders.put("Accept-Encoding","gzip,deflate");
mHeaders.put("Content-Type", "application/soap+xml");
mHeaders.put("Host", "35.15.85.55:8080");
mHeaders.put("Connection", "Keep-Alive");
mHeaders.put("User-Agent","AndroidApp");
mHeaders.put("Authorization","Basic Q2xpZW50NTkzMzppMjR3s2U="); // optional
}public final static InputStream receiveCurrentShipments(String stringUrlShipments)
{
int status=0;
String xmlstring= "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ser=\"http://35.15.85.55:8080/ServiceTransfer\">\n" +
" <soap:Header/>\n" +
" <soap:Body>\n" +
" <ser:GetAllOrdersOfShipment>\n" +
" <ser:CodeOfBranch></ser:CodeOfBranch>\n" +
" </ser:GetAllOrdersOfShipment>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
StringBuffer chaine = new StringBuffer("");
HttpURLConnection connection = null;
try {
URL url = new URL(stringUrlShipments);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Content-Length", xmlstring.getBytes().length + "");
connection.setRequestProperty("SOAPAction", "http://35.15.85.55:8080/ServiceTransfer/GetAllOrdersOfShipment");
for(Map.Entry<String, String> entry : mHeaders.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
connection.setRequestProperty(key,value);
}
connection.setRequestMethod("POST");
connection.setDoInput(true);
OutputStream outputStream = connection.getOutputStream();
outputStream.write(xmlstring.getBytes("UTF-8"));
outputStream.close();
connection.connect();
status = connection.getResponseCode();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
Log.i("HTTP Client", "HTTP status code : " + status);
}
InputStream inputStream = null;
try {
inputStream = connection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
}
AndroidからSOAP Webサービスを呼び出すには、このクライアントを使用してみてください。
Javaビルドパスにksoap2-Android.jarを追加することを忘れないでください
public class WsClient {
private static final String SOAP_ACTION = "somme";
private static final String OPERATION_NAME = "somme";
private static final String WSDL_TARGET_NAMESPACE = "http://example.ws";
private static final String SOAP_ADDRESS = "http://192.168.1.2:8080/axis2/services/Calculatrice?wsdl";
public String caclculerSomme() {
String res = null;
SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
OPERATION_NAME);
request.addProperty("a", "5");
request.addProperty("b", "2");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
try {
httpTransport.call(SOAP_ACTION, envelope);
String result = envelope.getResponse().toString();
res = result;
System.out.println("############# resull is :" + result);
} catch (Exception exception) {
System.out.println("########### ERRER" + exception.getMessage());
}
return res;
}
}
Soap Libaray(ksoap2-Android-Assembly-3.2.0-jar-with-dependencies.jar
)を追加してください。
public static String Fn_Confirm_CollectMoney_Approval(
HashMap < String, String > str1,
HashMap < String, String > str2,
HashMap < String, String > str3) {
Object response = null;
String METHOD_NAME = "CollectMoney";
String NAMESPACE = "http://xxx/yyy/xxx";
String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
String SOAP_ACTION = "";
try {
SoapObject RequestParent = new SoapObject(NAMESPACE, METHOD_NAME);
SoapObject Request1 = new SoapObject(NAMESPACE, "req");
PropertyInfo pi = new PropertyInfo();
Set mapSet1 = (Set) str1.entrySet();
Iterator mapIterator1 = mapSet1.iterator();
while (mapIterator1.hasNext()) {
Map.Entry mapEntry = (Map.Entry) mapIterator1.next();
String keyValue = (String) mapEntry.getKey();
String value = (String) mapEntry.getValue();
pi = new PropertyInfo();
pi.setNamespace("Java:com.xxx");
pi.setName(keyValue);
pi.setValue(value);
Request1.addProperty(pi);
}
mapSet1 = (Set) str3.entrySet();
mapIterator1 = mapSet1.iterator();
while (mapIterator1.hasNext()) {
Map.Entry mapEntry = (Map.Entry) mapIterator1.next();
// getKey Method of HashMap access a key of map
String keyValue = (String) mapEntry.getKey();
// getValue method returns corresponding key's value
String value = (String) mapEntry.getValue();
pi = new PropertyInfo();
pi.setNamespace("Java:com.xxx");
pi.setName(keyValue);
pi.setValue(value);
Request1.addProperty(pi);
}
SoapObject HeaderRequest = new SoapObject(NAMESPACE, "XXX");
Set mapSet = (Set) str2.entrySet();
Iterator mapIterator = mapSet.iterator();
while (mapIterator.hasNext()) {
Map.Entry mapEntry = (Map.Entry) mapIterator.next();
// getKey Method of HashMap access a key of map
String keyValue = (String) mapEntry.getKey();
// getValue method returns corresponding key's value
String value = (String) mapEntry.getValue();
pi = new PropertyInfo();
pi.setNamespace("Java:com.xxx");
pi.setName(keyValue);
pi.setValue(value);
HeaderRequest.addProperty(pi);
}
Request1.addSoapObject(HeaderRequest);
RequestParent.addSoapObject(Request1);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
SoapEnvelope.VER10);
soapEnvelope.dotNet = false;
soapEnvelope.setOutputSoapObject(RequestParent);
HttpTransportSE transport = new HttpTransportSE(URL, 120000);
transport.debug = true;
transport.call(SOAP_ACTION, soapEnvelope);
response = (Object) soapEnvelope.getResponse();
int cols = ((SoapObject) response).getPropertyCount();
Object objectResponse = (Object) ((SoapObject) response)
.getProperty("Resp");
SoapObject subObject_Resp = (SoapObject) objectResponse;
modelObject = new ResposeXmlModel();
String MsgId = subObject_Resp.getProperty("MsgId").toString();
modelObject.setMsgId(MsgId);
String OrgId = subObject_Resp.getProperty("OrgId").toString();
modelObject.setOrgId(OrgId);
String ResCode = subObject_Resp.getProperty("ResCode").toString();
modelObject.setResCode(ResCode);
String ResDesc = subObject_Resp.getProperty("ResDesc").toString();
modelObject.setResDesc(ResDesc);
String TimeStamp = subObject_Resp.getProperty("TimeStamp")
.toString();
modelObject.setTimestamp(ResDesc);
return response.toString();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}