2015-03-03 100 views

回答

2

看一看圖書館改造爲Android:http://square.github.io/retrofit/

這是非常簡單易用,而且非常可擴展性。

// below is the your client interface for wcf service 

public interface IServer{ 
    @POST("/GetUserDetails") 
    public void getUserDetails(@Body YourRequestClass request 
, Callback<YourResponseClass> response); 

} 

... 

// code to below goes in a class 

IServer server; 

private Client newClient() { 
     OkHttpClient okHttpClient = new OkHttpClient(); 
     okHttpClient.setSslSocketFactory(getSSLSocketFactory()); 
     return new OkClient(okHttpClient); 
} 

RestAdapter adapter = new RestAdapter.Builder() 
       .setConverter(new GsonConverter(gson)) 
       .setLogLevel(APIUtils.getLogLevel()) 
       .setClient(newClient()) 
       .setEndpoint("wcf service url") 
       .build(); 
this.server = adapter.create(IServer.class); 



.. 

使用示例一旦全部成立

server.getUserDetails(new YourRequestClass ,new Callback<YourResponseClass>() { 
     @Override 
     public void success(YourResponseClass yourResponse, Response response) { 
      // do something on success 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      // do something on error 
     } 
    }); 

下面是圖書館,你需要:

編譯 'com.squareup.retrofit:改造:1.9.0'

compile'c​​om.squareup.okhttp:okhttp-urlconnection:2.0.0'

compile'c​​om.squareup.okhttp: okhttp:2.0.0'

+0

有沒有簡單的例子? – user3086954 2015-03-03 10:51:02

+0

你沒有得到什麼,我會幫忙嗎? – 2015-03-03 11:01:44

+0

是的。實際上,在android中非常新,所以需要你的幫助來使用這個服務。我需要一步一步的過程來使用這個。我的Skype是msp.nitesh你能來嗎? – user3086954 2015-03-03 11:09:11

2

消耗WCF服務,而無需使用任何網絡庫,例如Retrofit你將需要作爲一個依賴添加ksoap2Gradle項目。您也可以下載jar文件here

你必須的jar文件添加到libs文件夾在你的項目庫目錄/YourProject/app/libs/ksoap2.jar然後還包括這一行你的應用程序Gradle文件

compile files('libs/ksoap2.jar') 

包括了此之後作爲依賴關係,您將不得不創建以下對象。它不一定非常像我的實現,這只是它看起來的一個版本。


YourWcfImplementation.java

import android.os.AsyncTask; 
import android.support.v4.util.Pair; 
import android.util.Log; 

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 java.util.List; 

public class YourWcfImplementation { 
    private static final String TAG = YourWcfImplementation.class.getSimpleName(); 

    private static final String NAMESPACE = "http://tempuri.org/"; 
    private static final String URL = "http://wcfservice.triptitiwari.com/Service1.svc"; 
    private static final String SERVICE_NAME = "IService1"; 

    private DataProcessingListener dataProcessingListener; 

    public YourWcfImplementation(DataProcessingListener dataProcessingListener) { 
     this.dataProcessingListener = dataProcessingListener; 
    } 

    /** 
    * Invokes a server request with specified parameters 
    * @param serviceTransportEntity 
    */ 
    public void invokeServiceRequest(ServiceTransportEntity serviceTransportEntity) { 
     new AsynchronousRequestTask().execute(serviceTransportEntity); 
    } 

    /** 
    * Handles the request processing 
    * @param params 
    */ 
    private String processRequest(ServiceTransportEntity params) { 
     String methodName = params.getMethodName(); 

     SoapObject request = new SoapObject(NAMESPACE, methodName); 
     String soapAction = NAMESPACE + SERVICE_NAME + "/" + methodName; 

     for (Pair<String, String> pair : params.getTransportProperties()) { 
      PropertyInfo prop = new PropertyInfo(); 
      prop.setName(pair.first); 
      prop.setValue(pair.second); 

      request.addProperty(prop); 
     } 

     SoapSerializationEnvelope envelope = getSoapSerializationEnvelope(request); 

     return executeHttpTransportCall(soapAction, envelope); 
    } 

    /** 
    * Execute the http call to the server 
    * @param soapAction 
    * @param envelope 
    * @return string response 
    */ 
    private String executeHttpTransportCall(String soapAction, SoapSerializationEnvelope envelope) { 
     String stringResponse; 

     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     try { 
      androidHttpTransport.call(soapAction, envelope); 

      SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); 
      stringResponse = String.valueOf(response); 
     } catch (Exception e) { 
      Log.e(TAG, "ERROR", e); 
      stringResponse = e.getMessage(); 
     } 

     return stringResponse; 
    } 

    /** 
    * Builds the serialization envelope 
    * @param request 
    * @return SoapSerializationEnvelope 
    */ 
    private SoapSerializationEnvelope getSoapSerializationEnvelope(SoapObject request) { 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.dotNet = true; 
     envelope.setOutputSoapObject(request); 

     return envelope; 
    } 

    /** 
    * Handles asynchronous requests 
    */ 
    private class AsynchronousRequestTask extends AsyncTask<ServiceTransportEntity, String, String> { 

     @Override 
     protected String doInBackground(ServiceTransportEntity... params) { 
      return processRequest(params[0]); 
     } 

     @Override 
     protected void onPostExecute(String response) { 
      dataProcessingListener.hasProcessedData(response); 
     } 
    } 

    public interface DataProcessingListener { 
     public void hasProcessedData(String data); 
    } 
} 

ServiceTransportEntity.java

/** 
* Entity that holds data used in the soap request 
*/ 
public class ServiceTransportEntity { 
    private String methodName; 
    private List<Pair<String, String>> transportProperties; 

    public ServiceTransportEntity(String methodName, List<Pair<String, String>> transportProperties) { 
     this.methodName = methodName; 
     this.transportProperties = transportProperties; 
    } 

    public String getMethodName() { 
     return methodName; 
    } 

    public List<Pair<String, String>> getTransportProperties() { 
     return transportProperties; 
    } 
} 

,然後你將只是實現與代碼的類,它應該類似於此

List<Pair<String, String>> properties = new ArrayList<>(); 
properties.add(new Pair<>("PropertyName", "PropertyValue")); 

ServiceTransportEntity serviceTransportEntity = new ServiceTransportEntity("SomeMethodName", properties); 
YourWcfImplementation wcfImplementation = new YourWcfImplementation(new YourWcfImplementation.DataProcessingListener() { 
    @Override 
    public void hasProcessedData(String response) { 
     //Do something with the response 
    } 
}).invokeServiceRequest(serviceTransportEntity); 
+0

非常感謝你。讓我試試這個 – user3086954 2015-03-03 11:10:50

+0

讓我知道它是否適合你 – Neil 2015-03-03 14:52:28