Cách gọi dịch vụ web SOAP trên Android [đã đóng]


553

Tôi gặp nhiều khó khăn khi tìm thông tin tốt về cách gọi dịch vụ web SOAP / WSDL tiêu chuẩn với Android. Tất cả những gì tôi có thể tìm thấy là các tài liệu và tài liệu tham khảo rất phức tạp về "kSoap2" và sau đó một chút về phân tích tất cả bằng tay với SAX . OK, điều đó tốt, nhưng đó là năm 2008, vì vậy tôi nghĩ rằng nên có một thư viện tốt để gọi các dịch vụ web tiêu chuẩn.

Dịch vụ web về cơ bản chỉ là một dịch vụ được tạo trong NetBeans . Tôi muốn có hỗ trợ IDE để tạo các lớp ống nước. Tôi chỉ cần cách dễ nhất / thanh lịch nhất để liên hệ với dịch vụ web dựa trên WSDL từ điện thoại dựa trên Android.


Đây là liên kết rất tốt về việc sử dụng SOAP trong Android: Cách gọi dịch vụ web trong Android bằng SOAP
Jainendra

Nếu trước đây ai đó quen thuộc với MS VS, sử dụng Mono cho Android sẽ giải quyết nhiều vấn đề với dịch vụ dữ liệu và dịch vụ web, mọi thứ đều đơn giản và phát triển nhanh. Ngoài ra, những người không quen thuộc với C # (mã rất giống với Java), tất cả các thư viện đều có cùng phương thức, một số hàm được thay thế trên các thuộc tính, vì vậy tên gần giống nhau và người đã viết trước đó trên Java cho Android có thể rất dễ dàng sử dụng kinh nghiệm của họ để viết c # mã.
Eugene Bosikov

Hãy xem Liên kết dưới đây, nó có Eaxample chi tiết về việc truy cập dịch vụ web trong Android bằng Ksoap2 Truy cập dịch vụ web từ Android
Fred Ondieki

Tôi tin rằng điều này là có thể với Xamarin / C # bằng cách sử dụng .Net Core. xem blog.msdn.microsoft.com/webdev/2016/05/25/ trên
Vahid Amiri

Công cụ này của Spring có vẻ đầy hứa hẹn.
Louis

Câu trả lời:


245

Android không cung cấp bất kỳ loại thư viện SOAP nào. Bạn có thể tự viết hoặc sử dụng cái gì đó như kSOAP 2 . Như bạn lưu ý, những người khác đã có thể biên dịch và sử dụng kSOAP2 trong các dự án của riêng họ, nhưng tôi không phải làm thế.

Google cho thấy, cho đến nay, ít quan tâm đến việc thêm thư viện SOAP vào Android. Tôi nghi ngờ về điều này là họ muốn hỗ trợ các xu hướng hiện tại trong Dịch vụ web đối với các dịch vụ dựa trên REST và sử dụng JSON làm định dạng đóng gói dữ liệu. Hoặc, sử dụng XMPP để nhắn tin. Nhưng đó chỉ là phỏng đoán.

Các dịch vụ web dựa trên XML là một nhiệm vụ không hề nhỏ trên Android tại thời điểm này. Không biết NetBeans, tôi không thể nói với các công cụ có sẵn ở đó, nhưng tôi đồng ý rằng nên có sẵn một thư viện tốt hơn. Có thể XmlPullParser sẽ cứu bạn khỏi việc sử dụng SAX, nhưng tôi không biết nhiều về điều đó.


7
Vâng, tôi nghĩ rằng tôi sẽ phải xây dựng một proxy REST. Có vẻ như khá lạ khi Google không quan tâm đến việc cung cấp hỗ trợ SOAP. Tôi đã thử phương pháp kSoap, nó thực sự không phải là một phương pháp thay thế nghiêm trọng. Đó là, tốt nhất, một xấu xí đã đòi hỏi nhiều nhóm tin tức.
BobbyShaftoe

19
Lý do có lẽ là SOAP rất dài dòng và không phục vụ tốt các ràng buộc của điện toán di động.
Neil

92
Câu trả lời này sẽ được cải thiện nếu ai đó có thể đề xuất giải pháp thay thế tốt nhất để gọi các dịch vụ web bằng Ứng dụng Android. Một khi mọi người tìm thấy câu hỏi này và đọc nó, đó là điều mà hầu hết họ sẽ tìm kiếm.
MGOwen

4
Xử lý SOAP cũng là bộ nhớ và bộ xử lý chuyên sâu so với định dạng ngắn gọn hơn như JSON.
Jeremy Edwards

3
@MGOwen Sự thay thế tốt nhất tôi có thể thấy là một proxy. Triển khai giao diện REST-Ful hỗ trợ các phong bì SOAP thông qua WSDL2Java.

99

org.apache.http.impl.client.DefaultHttpClientđi kèm trong SDK Android theo mặc định. Điều đó sẽ giúp bạn kết nối với WSDL.

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);

5
Vâng, đây sẽ là con đường mà tôi sẽ phải phân tích thủ công mọi thứ, tôi sẽ không có cách tiếp cận hướng đối tượng.
BobbyShaftoe

93
Bạn có nghĩa là bạn sẽ không có được một bữa ăn trưa miễn phí. Phân tích cú pháp thủ công không liên quan gì đến OO. Tôi có thể phân tích mọi thứ trên giấy với công cụ tiên tiến nhất của tôi là bút chì HB1 và ​​nó vẫn là OO.
Neil

8
Tôi tin rằng OO, tác giả có nghĩa là ràng buộc Java-XML. Điều gì sẽ là bước tiếp theo của bạn trong phương pháp này để phân tích phản ứng? Và nếu nó có hàng trăm yếu tố, được tổ chức theo cấu trúc cây?
rustyx

12
BTW, tôi mong đợi ít nhất một HTTP POST không phải là GET nếu bạn muốn có bất kỳ may mắn nào với SOAP. Ngoài ra, tiêu đề Chấp nhận và SOAPAction ở đâu? Nếu bạn thực sự muốn truy cập Commando, sẽ mất nhiều hơn 4 dòng này để sử dụng dịch vụ SOAP.
rustyx

6
@NeilD: Điều gì xảy ra nếu bạn bị ép buộc sử dụng SOAP, ví dụ: máy chủ web sử dụng SOAP và bạn không kiểm soát được điều này?
Bjarke Freund-Hansen

59

Đúng là do SOAP trên cao không phải là lựa chọn tốt nhất để trao đổi dữ liệu với thiết bị di động. Tuy nhiên, bạn có thể thấy mình trong tình huống không kiểm soát định dạng đầu ra của máy chủ.

Vì vậy, nếu bạn phải gắn bó với SOAP, có một thư viện kSOAP2 được vá cho Android tại đây:
http://code.google.com.vn/p/ksoap2-android/


31

Để gọi một dịch vụ web từ thiết bị di động (đặc biệt là trên điện thoại Android), tôi đã sử dụng một cách rất đơn giản để làm điều đó. Tôi chưa sử dụng bất kỳ API máy khách dịch vụ web nào để gọi dịch vụ web. Cách tiếp cận của tôi là như sau để thực hiện một cuộc gọi.

  1. Tạo kết nối HTTP đơn giản bằng cách sử dụng API tiêu chuẩn Java HttpURLConnection.
  2. Hình thành một yêu cầu SOAP. (Bạn có thể trợ giúp SOAPUI để thực hiện yêu cầu SOAP.)
  3. Đặt cờ doOutPut là đúng.
  4. Đặt các giá trị tiêu đề HTTP như độ dài nội dung, Loại nội dung và Tác nhân người dùng. Đừng quên đặt giá trị Độ dài nội dung vì đây là giá trị bắt buộc.
  5. Viết toàn bộ yêu cầu SOAP vào luồng đầu ra.
  6. Gọi phương thức để tạo kết nối và nhận phản hồi (Trong trường hợp của tôi, tôi đã sử dụng getResonseCode).
  7. Nếu mã phản hồi nhận được của bạn là
    1. Nó có nghĩa là bạn đã thành công để gọi dịch vụ web.
  8. Bây giờ lấy một luồng đầu vào trên cùng một kết nối HTTP và nhận đối tượng chuỗi. Đối tượng chuỗi này là một phản ứng SOAP.
  9. Nếu mã phản hồi khác 200, hãy lấy một ErrorInputluồng trên cùng HTTPobject và nhận lỗi nếu có.
  10. Phân tích phản hồi nhận được bằng SAXParser (trong trường hợp của tôi) hoặc DOMParaser hoặc bất kỳ cơ chế phân tích cú pháp nào khác.

Tôi đã thực hiện quy trình này cho điện thoại Android và nó đang chạy thành công. Tôi có thể phân tích cú pháp phản hồi ngay cả khi nó lớn hơn 700 KB.


30

SOAP là một công nghệ không phù hợp để sử dụng trên Android (hoặc thiết bị di động nói chung) do yêu cầu xử lý / phân tích cú pháp quá mức cần thiết. Dịch vụ REST là một giải pháp trọng lượng nhẹ hơn và đó là những gì tôi muốn đề xuất. Android đi kèm với trình phân tích cú pháp SAX và nó khá đơn giản để sử dụng. Nếu bạn hoàn toàn bắt buộc phải xử lý / phân tích SOAP trên thiết bị di động thì tôi cảm thấy tiếc cho bạn, lời khuyên tốt nhất tôi có thể đưa ra là đừng sử dụng SOAP.


2
Có một nơi đặc biệt trong địa ngục cho những người buộc các nhà phát triển sử dụng dịch vụ SOAP thay vì API REST.
Hitesh Sahu

24

Khoảng một năm trước, tôi đã đọc bài viết này khi cố gắng tìm ra cách thực hiện các cuộc gọi SOAP trên Android - những gợi ý để tự xây dựng bằng cách sử dụng HTTPClient dẫn đến việc tôi xây dựng thư viện SOAP của riêng mình cho Android:

IceSoap

Về cơ bản, nó cho phép bạn xây dựng các phong bì để gửi qua API Java đơn giản, sau đó tự động phân tích chúng thành các đối tượng mà bạn xác định thông qua XPath ... ví dụ:

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

Trở thành:

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

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

Tôi đã sử dụng nó cho dự án của riêng mình nhưng tôi nghĩ rằng nó có thể giúp đỡ một số người khác vì vậy tôi đã dành thời gian để tách nó ra và ghi lại nó. Tôi thực sự thích nó nếu một số linh hồn đáng thương của bạn vấp phải chủ đề này trong khi googling "SOAP Android" có thể cho nó đi và nhận được một số lợi ích.


bạn đã làm việc với xác thực phiên trên IceSoap?
Adnen Chouibi

24

KHÔNG GIỚI THIỆU ĐỂ THÊM ksoap2.jar trong dự án của bạn và cũng thêm quyền INTERNET trong tệp 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);
        }

    }
}

HttpTransportSE tôi có thể lấy lớp này ở đâu ??
Noman

Xin chào, tôi đang sử dụng mã của bạn nhưng tôi đang gặp phải lỗi sau, Phản hồi :: AuthenticicateTestResponse {xác thựcTestResult = anyType {resultCode = Error; tin nhắn = anyType {MessagesTypeMessage = anyType {code = E00014; văn bản = Xác thực người bán là bắt buộc.; }; }; }; } Bạn co thể giup tôi được không?
Hasmukh

hi Amit cũng im amit ..... u có thể cho tôi biết cách phản ứng chúng ta so sánh khi chúng tôi nhận được phản ứng là thành công hay không vậy làm thế nào và điều kiện gì để kiểm tra phản ứng ......
Amitsharma

Làm thế nào để thêm mảng trong xml thuộc tính yêu cầu?
droidster.me

21

Tôi đã thử nghiệm với KSOAP; Tôi đã chọn một cách tiếp cận khá đơn giản.

Đưa ra tệp WSDL, tạo các mẫu Yêu cầu SOAP cho mỗi Yêu cầu (ví dụ: sử dụng SOAP UI) và sau đó thay thế các giá trị được truyền trong mã. POST dữ liệu này đến điểm cuối dịch vụ bằng cách sử dụng đối tượng DefaultHttpClient và nhận luồng phản hồi. Phân tích luồng phản hồi bằng cách sử dụng trình phân tích cú pháp kéo XML.


18

Bạn có thể xem WSClient ++


4
Cuối cùng, một câu trả lời hữu ích đầu tiên sau khi lặp lại kSoap hoặc SAX
rustyx

Tôi đã thử phiên bản demo. Không làm việc cho tôi cho một dịch vụ đơn giản. Không có giá trị chi tiêu rất nhiều.
Tushar

16

Tôi đã tạo một ứng dụng khách SOAP mới cho nền tảng Android. Nó đang sử dụng một giao diện được tạo bởi JAX-WS, nhưng cho đến nay nó chỉ là một bằng chứng về khái niệm.

Nếu bạn quan tâm, vui lòng thử ví dụ và / hoặc xem nguồn tại AndroidSOAP .


1
Tôi rất vui được tham dự buổi thuyết trình của bạn tại JUM XVII. Budapest về công cụ Android này. Hãy tiếp tục phát huy!
pcjuzer

15

Nếu bạn có thể, hãy đi JSON. Android đi kèm với gói org.json hoàn chỉnh


14

Gọi các phương thức ksoap2 . Nó hoạt động rất tốt.

Thiết lập các chi tiết, như

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

và sau đó để có được kết quả làm

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();


11

Vài tháng trước tôi đã làm việc với dịch vụ web jax-ws trong ứng dụng j2ee, Chúng tôi đã sử dụng CXF wsdl2java để tạo ra máy khách WS từ tệp WSDL và với các máy khách đó chúng tôi đã sử dụng các dịch vụ web. Vài tuần trước, khi tôi cố gắng sử dụng dịch vụ web theo cách tương tự trong nền tảng Android, tôi không thể, vì jar Android không có tất cả các lớp hỗ trợ "jax-ws" trong đó. Lúc đó tôi đã không tìm thấy bất kỳ công cụ nào như vậy (nếu tôi không thể google một cách hiệu quả) để đáp ứng yêu cầu của tôi -

  • Lấy cuống máy khách từ WSDL.
  • Và gọi Dịch vụ với một số đối số (đối tượng yêu cầu kinh doanh java).
  • Lấy đối tượng kinh doanh đáp ứng.

Vì vậy, tôi đã phát triển Công cụ tạo khách hàng Android SOAP của riêng mình . Nơi bạn phải làm theo các bước sau:

  • Từ WSDL Nhận WS Client Stub, hãy đặt nó vào dự án của bạn.
  • Nói cho một số dịch vụ "ComplexOperationService", Khởi tạo dịch vụ, Nhận cổng Endpoint và gọi phương thức dịch vụ và nhận phản hồi từ dịch vụ Web:

ví dụ:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Bạn không cần quan tâm đến lớp dịch vụ / lớp req / phản hồi hoặc bất kỳ lớp nào khác cũng như phương thức, vì bạn biết tất cả các lớp được tạo từ WSDL.
  • Và tất nhiên bạn không cần phải biết về hành động xà phòng / phong bì / không gian tên, v.v. Chỉ cần gọi phương thức như chúng tôi, các nhà phát triển làm mọi lúc.

Bạn có biết làm thế nào để đối phó với ngày? Apache CXF dịch nó sang XMLGregorianCalWiki mà tôi không thể tạo trong Android.
Martin Nuc



6

Thực hiện theo các bước sau bằng phương pháp SOAP

Từ tệp WSDL,

  • tạo mẫu Yêu cầu SOAP cho mỗi Yêu cầu.

  • Sau đó thay thế các giá trị được truyền trong mã.

  • POST dữ liệu này đến điểm cuối dịch vụ bằng cách sử dụng thể hiện DefaultHttpClient.

  • Nhận luồng phản hồi và cuối cùng

  • Phân tích luồng phản hồi bằng cách sử dụng trình phân tích cú pháp kéo XML.



6

Đối với tôi cách dễ nhất là sử dụng công cụ tốt để tạo tất cả các lớp cần thiết. Cá nhân tôi sử dụng trang web này:

http://easywsdl.com/

Nó hỗ trợ các dịch vụ web khá phức tạp và sử dụng ksoap2.


5

Tôi sẽ đề nghị kiểm tra một công cụ rất hữu ích giúp tôi rất nhiều. Những người chăm sóc dự án đó cũng rất hữu ích. www.wsdl2code.com/


5

Nếu bạn gặp vấn đề liên quan đến việc gọi Dịch vụ web trong Android thì Bạn có thể sử dụng mã bên dưới để gọi dịch vụ web và nhận phản hồi. Đảm bảo rằng dịch vụ web của bạn trả về phản hồi ở Định dạng bảng dữ liệu .. Mã này sẽ giúp bạn nếu bạn sử dụng dữ liệu từ cơ sở dữ liệu SQL Server . Nếu bạn sử dụng MYSQL, bạn cần thay đổi một điều, chỉ cần thay thế từ NewDataSet từ câu obj2=(SoapObject) obj1.getProperty("NewDataSet");bằng DocumentEuity

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

Nếu bạn có bất kỳ vấn đề liên quan đến điều này, bạn có thể viết cho tôi ..


4

Vui lòng tải xuống và thêm tệp thư viện SOAP với Tên tệp dự án của bạn: ksoap2-android-assembly-3.4.0-jar-with-Depencies

Làm sạch ứng dụng và sau đó bắt đầu chương trình

Đây là mã cho cuộc gọi dịch vụ 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";
    }

Các kết quả có thể là JSONObject hoặc JSONArray Hoặc String

Để bạn tham khảo tốt hơn, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Cảm ơn.


3

Đây là một ví dụ hoạt động về việc tiêu thụ các dịch vụ web SOAP trong Android.

** Lưu ý :: *** KHÔNG GIỚI THIỆU ĐỂ THÊM ksoap2.jar trong dự án của bạn và cũng thêm quyền INTERNET trong tệp AndroidManifest *

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

vui lòng giúp tôi về vấn đề này stackoverflow.com/questions/41573829/ từ
Edijae Crusar

3

Bạn có thể thực hiện cuộc gọi xà phòng như bài đăng qua http với một số tiêu đề nhất định. Tôi đã giải quyết câu hỏi này mà không cần các thư viện bổ sung như ksoap2 Đây là mã trực tiếp nhận đơn đặt hàng từ dịch vụ xà phòng

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

vui lòng giúp đỡ tại đây stackoverflow.com/questions/41573829/ khăn
Edijae Crusar

hai câu hỏi về điều này: 1. Điều này được gọi như thế nào từ hoạt động chính? 2. Giá trị của StringUrlShipment phải được truyền dưới dạng tham số là gì?
Tori

về nhận xét trên, bỏ qua câu hỏi số 1.
Tori

Từ hoạt động chính, bạn nên sử dụng AsyncTask để gọi mã này. Bên trong lớp AsyncTask này triển khai doInBackground để khởi chạy mã này
Lapenkov Vladimir

2

Để gọi Dịch vụ web SOAP từ Android, hãy thử sử dụng ứng dụng khách này

KHÔNG GIỚI THIỆU ĐỂ THÊM ksoap2-android.jar trong đường dẫn xây dựng java của bạn

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

@ Wajdi hh làm thế nào để so sánh độ phân giải phản hồi từ kết quả phản hồi của người tặng: - thành công ..... "responce = 1 ~ Thành công" .... vậy làm thế nào chúng ta so sánh kết quả đó từ điều kiện từ phía máy chủ ...... ..
Amitsharma

1

Thêm xà phòng Libaray ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar):

Chuỗi tĩnh công khai 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;
    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.