java - Androi如何调用SOAP web服务

  显示原文与译文双语对照的内容

我在寻找如何用Android调用标准的soap/wsdl网络服务时遇到很多问题。 我所能找到的都是非常复杂的文档和对"ksoap2"的引用,然后使用 SAX编辑器手工解析它。 好的,这很好,但是它是 2008,所以我认为应该有一些好的库来调用标准 Web服务 。

NetBeans在网络,服务只是基本上一个创建建成。 我想在内部支持生成卫浴类。 我只需要简单的/most-elegant方式来与基于Android的手机的 WSDL web服务联系。

时间:

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

为了从移动设备( 尤其是在Android手机上) 调用网络服务,我使用了一个非常简单的方法来实现它。 我没有使用任何网络服务客户端API来调用网络服务。 我的方法是打电话。

  1. 使用Java标准 API HttpURLConnection 创建一个简单的HTTP连接。
  2. 形成一个SOAP请求。( 你可以使用SOAPUI来制作一个SOAP请求。)
  3. 将doOutPut标志设置为真。
  4. 设置像 Content-Length,内容类型和 USER-AGENT 这样的HTTP头值。 别忘了设置 Content-Length 值,因为它是一个强制的。
  5. 将整个SOAP请求写入输出流。
  6. 调用该方法建立连接并接收响应( 在我的案例中我使用了 getResonseCode ) 。
  7. 如果你收到的响应代码为
    1. 这意味着你已经成功地调用了web服务。
  8. 现在在同一个HTTP连接上输入一个输入流并接收字符串对象。 这个字符串对象是一个SOAP响应。
  9. 如果any,后对同一HTTPobject和接收错误如果响应码是 200以外再看一 ErrorInput stream.
  10. 使用 SAXParser ( 在我的例子中) 或者DOMParaser或者任何其他解析机制解析接收的响应。

我已经为Android手机实现了这个过程,它已经成功运行。 我可以解析响应,即使它超过 700 KB 。

不要忘记在项目中添加 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);
 }

 }
 }

在我建立我自己的SOAP库用于android,大约一年前,我在阅读这个帖子一直试图弄明白要做SOAP的调用安卓系统使用多线程断点续传功能 resulted: - 那些建议来构建我自己

IceSoap

基本上它允许你构建通过一个简单的javaapi发送的信封,然后自动将它们解析为你通过xpath定义的对象。。 例如:


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

变成:


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

 @XMLField("Name")
 private String name;
}

我在自己的项目中使用它,但我觉得它可能会帮助其他人,所以我花了一些时间把它分开并记录下来。 我真的很喜欢你的一些可怜的灵魂在谷歌搜索"肥皂泡"时发现这个线程,并获得一些好处。

...