如何在Android上调用SOAP Web服务

我很难find有关如何使用Android调用标准SOAP / WSDL Web服务的好信息。 我所能find的都是非常复杂的文档和对“kSoap2”的引用,然后一些关于SAX手动parsing的内容。 好吧,这很好,但是现在是2008年,所以我觉得应该有一个好的库来调用标准的Web服务。

Web服务基本上是在NetBeans中创build的。 我想要IDE支持生成pipe道类。 我只需要以最简单/最优雅的方式联系基于Android的手机的基于WSDL的Web服务。

Android不提供任何types的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并不是与移动设备进行数据交换的最佳select。 但是,您可能发现自己处于不控制服务器输出格式的情况。

所以,如果你必须坚持使用SOAP,那么在这里为Android安装一个kSOAP2库:
http://code.google.com/p/ksoap2-android/

要从移动设备(特别是在Android手机上)调用Web服务,我已经使用了一种非常简单的方法来实现它。 我没有使用任何Web服务客户端API来尝试调用Web服务。 我的方法如下拨打电话。

  1. 通过使用Java标准API HttpURLConnection创build一个简单的HTTP连接。
  2. 形成一个SOAP请求。 (您可以帮助SOAPUI来发出SOAP请求。)
  3. 将doOutPut标志设置为true。
  4. 设置HTTP标头值,如内容长度,内容types和用户代理。 不要忘记设置内容长度值,因为这是必需的。
  5. 将整个SOAP请求写入输出stream。
  6. 调用方法来build立连接并接收响应(在我的情况下,我使用getResonseCode )。
  7. 如果您收到的回复代码为
    1. 这意味着您可以成功地调用Web服务。
  8. 现在在同一个HTTP连接上接受一个inputstream并接收string对象。 这个string对象是一个SOAP响应。
  9. 如果响应代码不是200,则在相同的HTTP ErrorInput上使用ErrorInputstream,并接收错误(如果有)。
  10. 使用SAXParser(在我的情况下)或DOMParaser或任何其他parsing机制parsing收到的响应。

我已经为Android手机实施了这个程序,并成功运行。 即使超过700 KB,我也能够parsing响应。

由于所需的处理/parsing开销,SOAP在Android(或通常的移动设备)上使用是不合适的技术。 REST服务是一个更轻的解决scheme,这就是我所build议的。 Android自带了SAXparsing器,使用起来相当简单。 如果您绝对需要在移动设备上处理/parsingSOAP,那么我为您感到遗憾,我所能提供的最好build议就是不使用SOAP。

请勿忘记在您的项目中添加ksoap2.jar,并在AndroidManifest文件中添加INTERNET权限

 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); } } } 

大约一年前,我正在阅读这个线程,试图弄清楚如何在Android上进行SOAP调用 – 使用HttpClient构build自己的build议导致我为Android构build自己的SOAP库:

IceSoap

基本上它允许你build立信封,通过一个简单的Java API发送,然后自动将它们parsing成你通过XPath定义的对象…例如:

 <Dictionary> <Id></Id> <Name></Name> </Dictionary> 

变为:

 @XMLObject("//Dictionary") public class Dictionary { @XMLField("Id") private String id; @XMLField("Name") private String name; } 

我用它来做我自己的项目,但我觉得这可能会帮助其他人,所以我花了一些时间把它分离出来并logging下来。 我真的很喜欢它,如果你的一些可怜的灵魂在使用“SOAP Android”的时候绊倒了这个线程,可能会给它带来一些好处。

我跟KSOAP有过约会。 我select了一个相对简单的方法。

给定一个WSDL文件,为每个请求创buildSOAP请求模板(例如:使用SOAP UI),然后用值代替传入的值。 使用DefaultHttpClient实例将此数据发布到服务端点,并获取响应stream。 使用XML Pullparsing器parsing响应stream。

你可以看看WSClient ++

我为Android平台创build了一个新的SOAP客户端。 它正在使用JAX-WS生成的接口,但它迄今只是一个概念validation。

如果您有兴趣,请尝试示例和/或在AndroidSOAP上观看源代码。

如果可以的话,去JSON。 Android提供了完整的org.json包

调用ksoap2方法。 它工作得很好。

设置细节,如

 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服务有帮助。

我相信你可以用Axis做一个SOAP客户端。 Axis安装说明 。

几个月前,我在j2ee应用程序中使用jax-ws Web服务,在那里我们使用CXF wsdl2java从WSDL文件生成WS客户端存根,并使用这些客户端存根来使用Web服务。 几个星期前,当我试图在Android平台上以相同的方式使用Web服务时,我不能这样做,因为android jar并不是所有支持类的“jax-ws”。 那次我没有find任何这样的工具(如果我没有失败谷歌效率),以满足我的要求 –

  • 从WSDL获取客户端存根。
  • 并用一些参数(java业务请求对象)调用服务。
  • 获取响应业务对象。

所以,我开发了自己的Android SOAP客户端生成工具 。 您必须按照以下步骤操作:

  • 从WSDL获取WS客户端存根,将其放入您的项目中。
  • 说一些服务“ComplexOperationService”,实例化服务,获取端点端口并调用服务方法,并从Web服务获取响应:

例如:

 ComplexOperationService service = new ComplexOperationService( ); ComplexOperation port= service.getComplexOperationPort(); SomeComplexRequest request = --Get some complex request----; SomeComplexResp resp = port.operate( request ); 
  • 您不需要关心服务类/ req / response类或任何其他类以及方法,因为您知道它们都是从WSDL生成的。
  • 当然,你不需要知道soap action / envelop / namespace等等,只需要像开发者一样调用这个方法即可。

我认为从Android应用程序调用SOAP Web服务将帮助你很多。

按照SOAP方法执行这些步骤

从WSDL文件中,

  • 为每个请求创buildSOAP请求模板。

  • 然后将这些值replace为代码中传递的值。

  • 使用DefaultHttpClient实例将此数据发布到服务端点。

  • 获取响应stream,最后

  • 使用XML Pullparsing器parsing响应stream。

如果您可以使用JSON,则可以使用PHP服务器和Android手机客户端开发应用程序服务中的白皮书,video和sample.code。

对我来说,最简单的方法是使用好的工具来生成所有需要的类。 我个人使用这个网站:

http://easywsdl.com/

它支持相当复杂的Web服务并使用kso​​ap2。

我会build议检查一个非常有用的工具,帮助我很多。 照顾这个项目的人也非常有帮助。 http://www.wsdl2code.com/

如果您在Android中调用Web服务时遇到问题,那么您可以使用下面的代码来调用Web服务并获取响应。请确保您的Web服务以数据表格式返回响应。如果您使用的数据来自SQL Server数据库。如果你使用MYSQL,你需要改变一件事,就是从句子obj2=(SoapObject) obj1.getProperty("NewDataSet");replace单词NewDataSet obj2=(SoapObject) obj1.getProperty("NewDataSet");DocumentElement

void callWebService(){

 private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name ie 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服务的一个工作示例。

**注意:***请勿忘记在您的项目中添加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/

谢谢。

要从android调用SOAP Web服务,请尝试使用此客户端

不要忘记在你的java构buildpath中添加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; } } 

您可以使用特定标题以http的forms执行soap调用。 我解决了这个问题,没有额外的库,如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; } 

添加Soap Libaray( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar ):

公共静态stringFn_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; } }