วิธีเรียกใช้บริการเว็บ SOAP บน Android [ปิด]


553

ฉันมีปัญหามากมายในการค้นหาข้อมูลที่ดีเกี่ยวกับวิธีเรียกใช้บริการเว็บ SOAP / WSDL มาตรฐานกับ Android ทั้งหมดที่ฉันได้รับสามารถที่จะหามีทั้งเอกสารที่ซับซ้อนมากและการอ้างอิงถึง "kSoap2" แล้วบิตบางอย่างเกี่ยวกับการแยกมันทั้งหมดด้วยตนเองกับแซ็กโซโฟน ตกลงก็ไม่เป็นไร แต่ปี 2008 ฉันคิดว่าควรมีห้องสมุดที่ดีสำหรับเรียกบริการเว็บมาตรฐาน

บริการเว็บเป็นเพียงพื้นหนึ่งสร้างขึ้นในNetBeans ฉันต้องการได้รับการสนับสนุน IDE สำหรับการสร้างคลาสการประปา ฉันต้องการวิธีที่ง่ายที่สุด / หรูหราที่สุดในการติดต่อบริการเว็บที่ใช้WSDLจากโทรศัพท์ที่ใช้ Android


นี่คือลิงค์ที่ดีมากเกี่ยวกับการใช้สบู่ใน Android: วิธีการโทรบริการเว็บใน Android โดยใช้สบู่
Jainendra

หากก่อนหน้านี้เคยมีคนคุ้นเคยกับ MS VS การใช้ Mono สำหรับ Android จะช่วยแก้ปัญหามากมายเกี่ยวกับบริการข้อมูลและบริการบนเว็บทุกอย่างเป็นการพัฒนาที่ง่ายและรวดเร็ว นอกจากนี้ผู้ที่ไม่คุ้นเคยกับ C # (รหัสคล้ายกันมากกับ Java), ไลบรารีทั้งหมดมีวิธีการเดียวกัน, ฟังก์ชั่นบางอย่างถูกแทนที่ด้วยคุณสมบัติ, ดังนั้นชื่อเกือบจะเหมือนกันและผู้เขียนก่อนหน้านี้บน Java สำหรับ Android สามารถใช้ประสบการณ์ รหัส.
Eugene Bosikov

ดูที่ลิงค์ด้านล่างมันมีรายละเอียด Eaxample เกี่ยวกับการเข้าถึงเว็บเซอร์ใน Android โดยใช้ Ksoap2 การเข้าถึงเว็บเซอร์จาก Android
Fred Ondieki

ฉันเชื่อว่านี่เป็นไปได้กับ Xamarin / C # โดยใช้. Net Core ดูblogs.msdn.microsoft.com/webdev/2016/05/25/…
Vahid Amiri

นี้เครื่องมือโดยลักษณะฤดูใบไม้ผลิที่มีแนวโน้ม
Louis

คำตอบ:


245

Android ไม่มีไลบรารี SOAP ประเภทใด ๆ คุณสามารถเขียนของคุณเองหรือการใช้งานบางอย่างเช่นkSOAP 2 อย่างที่คุณทราบคนอื่นสามารถคอมไพล์และใช้ kSOAP2 ในโครงการของตัวเองได้ แต่ฉันไม่ต้องทำ

จนถึงปัจจุบัน Google ได้แสดงความสนใจเพียงเล็กน้อยในการเพิ่มห้องสมุด SOAP ให้กับ Android ความสงสัยของฉันสำหรับสิ่งนี้คือพวกเขาต้องการสนับสนุนแนวโน้มปัจจุบันของบริการบนเว็บไปยังบริการที่ใช้ REST และใช้ JSON เป็นรูปแบบการห่อหุ้มข้อมูล หรือใช้ XMPP เพื่อส่งข้อความ แต่นั่นเป็นเพียงการคาดเดา

บริการเว็บที่ใช้ XML เป็นงานที่ไม่สำคัญสำหรับ Android ในขณะนี้ ไม่ทราบว่า NetBeans ฉันไม่สามารถพูดกับเครื่องมือที่มี แต่ฉันเห็นด้วยว่าควรมีห้องสมุดที่ดีกว่านี้ เป็นไปได้ว่า XmlPullParser จะช่วยให้คุณประหยัดจากการใช้ SAX แต่ฉันไม่รู้เรื่องนั้นมากนัก


7
ใช่ฉันคิดว่าฉันจะต้องสร้าง REST proxy ดูเหมือนว่าค่อนข้างแปลกที่ Google ไม่มีความสนใจในการให้การสนับสนุน SOAP ฉันลองใช้วิธี kSoap มันไม่ใช่ทางเลือกที่จริงจังจริงๆ ที่ดีที่สุดคือการมีกลุ่มที่น่าเกลียดซึ่งต้องใช้กลุ่มข่าวมาก
BobbyShaftoe

19
เหตุผลอาจเป็นไปได้ว่า SOAP นั้นมีความละเอียดมากและไม่สามารถตอบสนองต่อข้อ จำกัด ของการใช้คอมพิวเตอร์มือถือ
Neil

92
คำตอบนี้จะได้รับการปรับปรุงหากมีคนแนะนำทางเลือกที่ดีที่สุดในการโทรบริการเว็บด้วยแอพ Android เมื่อผู้คนพบคำถามนี้และอ่านแล้วนั่นคือสิ่งที่พวกเขาส่วนใหญ่จะมองหา
MGOwen

4
การประมวลผล SOAP เป็นหน่วยความจำและตัวประมวลผลที่เข้มข้นเมื่อเทียบกับรูปแบบที่กระชับยิ่งขึ้นเช่น JSON
Jeremy Edwards

3
@MGOwen ทางเลือกที่ดีที่สุดที่ฉันเห็นคือพร็อกซี ใช้อินเตอร์เฟส REST-ful ที่พร็อกซี SOAP ซองจดหมายผ่าน WSDL2Java

99

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

5
ใช่นี่เป็นเส้นทางที่ฉันจะต้องแยกวิเคราะห์ทุกอย่างด้วยตนเองฉันจะไม่ได้รับวิธีการเชิงวัตถุ
BobbyShaftoe

93
คุณหมายความว่าคุณจะไม่ได้รับอาหารกลางวันฟรี การแยกวิเคราะห์แบบแมนนวลไม่มีส่วนเกี่ยวข้องกับ OO ฉันสามารถแยกวิเคราะห์ทุกอย่างบนกระดาษด้วยเครื่องมือที่ทันสมัยที่สุดของฉันในการเป็นดินสอ HB1 และมันจะยังคงเป็น OO
Neil

8
ฉันเชื่อโดย OO ผู้เขียนหมายถึงการผูก Java-XML ขั้นตอนต่อไปของคุณในการวิเคราะห์คำตอบคืออะไร และถ้ามันมีหลายร้อยองค์ประกอบจัดระเบียบในโครงสร้างต้นไม้หรือไม่?
rustyx

12
BTW ฉันคาดหวังอย่างน้อย HTTP POST ไม่ใช่ GET ถ้าคุณต้องการโชคด้วย SOAP นอกจากนี้ส่วนหัวของ Accept และ SOAPAction อยู่ที่ไหน ถ้าคุณต้องการที่จะไปคอมมานโดจริง ๆ มันจะใช้เวลามากกว่า 4 บรรทัดเพื่อใช้บริการ SOAP
rustyx

6
@NeilD: ถ้าคุณถูกบังคับโดยสถานการณ์ให้ใช้ SOAP เช่นเว็บเซิร์ฟเวอร์ใช้ SOAP และคุณไม่สามารถควบคุมสิ่งนี้ได้?
Bjarke Freund-Hansen

59

จริงอยู่ที่ SOAP ไม่ใช่ค่าตัวเลือกที่ดีที่สุดสำหรับการแลกเปลี่ยนข้อมูลกับอุปกรณ์พกพา อย่างไรก็ตามคุณอาจพบว่าตัวเองอยู่ในสถานการณ์ที่คุณไม่ได้ควบคุมรูปแบบของเอาต์พุตเซิร์ฟเวอร์

ดังนั้นหากคุณต้องติดกับ SOAP มีไลบรารี kSOAP2 สำหรับ Android ที่นี่:
http://code.google.com/p/ksoap2-android/


31

ในการโทรบริการเว็บจากอุปกรณ์มือถือ (โดยเฉพาะบนโทรศัพท์ Android) ฉันได้ใช้วิธีที่ง่ายมากในการทำ ฉันไม่ได้ใช้ API ของไคลเอ็นต์บริการเว็บใด ๆ ในความพยายามที่จะเรียกใช้บริการเว็บ วิธีการของฉันมีดังนี้เพื่อโทรออก

  1. สร้างการเชื่อมต่อที่ง่าย HTTP โดยใช้มาตรฐาน HttpURLConnectionAPI
  2. สร้างคำขอ SOAP (คุณสามารถช่วย SOAPUI เพื่อทำการร้องขอ SOAP ได้)
  3. ตั้งค่าสถานะ doOutPut เป็นจริง
  4. ตั้งค่าส่วนหัว HTTP เช่นความยาวเนื้อหาประเภทเนื้อหาและตัวแทนผู้ใช้ อย่าลืมตั้งค่าความยาวเนื้อหาตามที่บังคับ
  5. เขียนคำร้องขอ SOAP ทั้งหมดไปยังเอาต์พุตสตรีม
  6. เรียกวิธีการเชื่อมต่อและรับการตอบกลับ (ในกรณีที่ฉันใช้ getResonseCode)
  7. หากคุณได้รับรหัสตอบกลับเป็น
    1. หมายความว่าคุณประสบความสำเร็จในการโทรหาบริการเว็บ
  8. ตอนนี้ใช้สตรีมอินพุตบนการเชื่อมต่อ HTTP เดียวกันและรับวัตถุสตริง วัตถุสตริงนี้คือการตอบสนอง SOAP
  9. หากรหัสการตอบสนองเป็นอย่างอื่นนอกเหนือจาก 200 ให้ใช้ErrorInputสตรีมบน HTTPobject เดียวกันและรับข้อผิดพลาดถ้ามี
  10. แยกการตอบสนองที่ได้รับโดยใช้ SAXParser (ในกรณีของฉัน) หรือ DOMParaser หรือกลไกการแยกวิเคราะห์อื่น ๆ

ฉันใช้ขั้นตอนนี้สำหรับโทรศัพท์ Android และใช้งานได้สำเร็จ ฉันสามารถวิเคราะห์คำตอบได้แม้ว่าจะมีขนาดมากกว่า 700 KB


30

SOAP เป็นเทคโนโลยีที่ไม่เหมาะสมสำหรับการใช้งานบน Android (หรืออุปกรณ์พกพาโดยทั่วไป) เนื่องจากการประมวลผล / ค่าใช้จ่ายในการแยกวิเคราะห์ที่จำเป็น บริการ REST เป็นโซลูชันน้ำหนักเบาและนั่นคือสิ่งที่ฉันอยากจะแนะนำ Android มาพร้อมกับตัวแยกวิเคราะห์ SAX และมันค่อนข้างใช้งานง่าย หากคุณจำเป็นต้องจัดการ / แยกวิเคราะห์ SOAP บนอุปกรณ์มือถือฉันรู้สึกเสียใจแทนคำแนะนำที่ดีที่สุดที่ฉันมีให้คือไม่ใช้ SOAP


2
มีสถานที่พิเศษสำหรับผู้ที่บังคับให้นักพัฒนาใช้บริการ SOAP แทน REST API
Hitesh Sahu

24

เกี่ยวกับปีที่แล้วฉันอ่านกระทู้นี้พยายามคิดวิธีโทร SOAP บน Android - คำแนะนำในการสร้างของฉันเองโดยใช้ HttpClient ทำให้ฉันสร้างห้องสมุด SOAP ของตัวเองสำหรับ Android:

IceSoap

โดยทั่วไปจะช่วยให้คุณสร้างซองจดหมายเพื่อส่งผ่าน Java API แบบง่ายแล้วแยกวิเคราะห์โดยอัตโนมัติเป็นวัตถุที่คุณกำหนดผ่าน XPath ... ตัวอย่างเช่น:

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

กลายเป็น:

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

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

ฉันใช้มันสำหรับโครงการของตัวเอง แต่ฉันคิดว่ามันอาจช่วยคนอื่นได้ดังนั้นฉันจึงใช้เวลาแยกมันออกมาและจัดทำเอกสาร ฉันจะรักมันจริงๆถ้าวิญญาณที่ยากจนของคุณที่สะดุดในหัวข้อนี้ในขณะที่ googling "SOAP Android" สามารถให้มันไปและได้รับประโยชน์บางอย่าง


คุณทำงานกับการตรวจสอบสิทธิ์เซสชันบน IceSoap หรือไม่
Adnen Chouibi

24

อย่าลืมเพิ่ม 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);
        }

    }
}

HttpTransportSE ฉันจะรับคลาสนี้ได้ที่ไหน ??
Noman

สวัสดีฉันใช้รหัสของคุณ แต่ฉันได้รับข้อผิดพลาดดังต่อไปนี้การตอบสนอง :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = ข้อผิดพลาด; ข้อความ = anytype {MessagesTypeMessage = anytype {รหัส E00014 =; text = ต้องการการรับรองความถูกต้องของผู้ขาย; }; }; }; } ได้โปรดช่วยฉันหน่อยได้ไหม?
Hasmukh

สวัสดี Amit im amit ..... คุณช่วยบอกฉันได้อย่างไรว่าการตอบสนองที่เราเปรียบเทียบเมื่อเราได้รับการตอบสนองนั้นประสบความสำเร็จหรือไม่อย่างไรและเงื่อนไขอะไรที่จะตรวจสอบการตอบสนอง ......
Amitsharma

วิธีการเพิ่มอาร์เรย์ในคุณสมบัติคำขอ XML?
droidster.me

21

ฉันได้นัดกับ KSOAP ฉันเลือกวิธีที่ค่อนข้างง่ายกว่า

ให้ไฟล์ WSDL สร้างแม่แบบคำขอ SOAP สำหรับแต่ละคำขอ (เช่น: ใช้ SOAP UI) แล้วแทนที่ค่าที่จะส่งผ่านในรหัส โพสต์ข้อมูลนี้ไปยังจุดสิ้นสุดบริการโดยใช้อินสแตนซ์ DefaultHttpClient และรับสตรีมการตอบกลับ แยกวิเคราะห์ Response Stream โดยใช้ parser XML Pull


18

คุณสามารถดูWSClient ++


4
ในที่สุดคำตอบที่มีประโยชน์ครั้งแรกหลังจากทำซ้ำ kSoap หรือ SAX
rustyx

ฉันลองรุ่นตัวอย่าง ไม่ได้ทำงานให้ฉันเพื่อรับบริการที่เรียบง่าย การใช้จ่ายมีมูลค่าไม่มากนัก $$$$$
Tushar

16

ฉันได้สร้างไคลเอนต์ SOAP ใหม่สำหรับแพลตฟอร์ม Android มันใช้อินเตอร์เฟสที่สร้างขึ้น JAX-WS แต่มันก็เป็นเพียงหลักฐานพิสูจน์แนวคิด

หากคุณสนใจโปรดลองตัวอย่างและ / หรือดูแหล่งที่มาที่AndroidSOAP


1
ฉันมีความสุขที่ได้เข้าร่วมการนำเสนอของคุณที่ JUM XVII บูดาเปสต์เกี่ยวกับสิ่งนี้ Android ดีแล้วทำต่อไป!
pcjuzer

15

หากเป็นไปได้ให้ไปที่ JSON Android มาพร้อมกับแพ็คเกจ org.json ที่สมบูรณ์


14

โทร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();


11

ไม่กี่เดือนที่ผ่านมาฉันทำงานกับเว็บเซอร์วิส jax-ws ในแอปพลิเคชันj2ee ที่นั่นเราใช้CXF wsdl2javaเพื่อสร้างสตับไคลเอนต์ WS จากไฟล์ WSDL และกับสตับของลูกค้าที่เราใช้บริการเว็บ ไม่กี่สัปดาห์ที่ผ่านมาเมื่อฉันพยายามใช้บริการเว็บในลักษณะเดียวกันในแพลตฟอร์ม Android ฉันทำไม่ได้เพราะ jar android ไม่มี "jax-ws" ที่สนับสนุนคลาสทั้งหมดในนั้น ครั้งนั้นฉันไม่พบเครื่องมือดังกล่าว (หากฉันไม่ได้ google ล้มเหลวอย่างมีประสิทธิภาพ) เพื่อให้ตรงกับความต้องการของฉัน -

  • รับ stub ไคลเอนต์จาก WSDL
  • และเรียกใช้บริการพร้อมอาร์กิวเมนต์ (วัตถุคำขอทางธุรกิจของ java)
  • รับออปเจ็กต์ธุรกิจการตอบสนอง

ดังนั้นผมพัฒนาของตัวเองAndroid SOAP เครื่องมือรุ่นไคลเอ็นต์ ที่ที่คุณต้องทำตามขั้นตอนเหล่านี้:

  • จาก WSDL รับ Stub ไคลเอ็นต์ WS วางไว้ในโครงการของคุณ
  • พูดสำหรับบริการบางอย่าง "ComplexOperationService" ยกตัวอย่างบริการรับพอร์ตปลายทางและเรียกใช้วิธีการบริการและรับการตอบสนองจากบริการเว็บ:

เช่น:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • คุณไม่จำเป็นต้องสนใจคลาสเซอร์วิส / req / response หรือคลาสอื่นใดและเมธอดเช่นกันเนื่องจากคุณรู้ว่ามันถูกสร้างขึ้นจาก WSDL
  • และแน่นอนว่าคุณไม่จำเป็นต้องรู้ถึงการเคลื่อนไหวของสบู่ / ซองจดหมาย / เนมสเปซ ฯลฯ เพียงแค่เรียกวิธีนี้ในขณะที่เราผู้พัฒนาทำตลอดเวลา

คุณรู้วิธีจัดการกับวันที่หรือไม่? Apache CXF แปลเป็น XMLGregorianCalendar ซึ่งฉันไม่สามารถสร้างใน Android
Martin Nuc

9

ผมมั่นใจว่าคุณจะทำให้ลูกค้าสบู่เล็ก ๆ น้อย ๆ กับฝ่ายอักษะ คำแนะนำการติดตั้งแกน


2
มันจะทำงานได้ก็ต่อเมื่อแกนเข้ากันได้กับ Android ไม่ใช่ (เกี่ยวกับ javax. * แพ็คเกจในการขึ้นต่อกันของแกน)
PaulProgrammer


6

ทำตามขั้นตอนเหล่านี้ด้วยวิธี SOAP

จากไฟล์ WSDL

  • สร้างเท็มเพลตคำร้องขอ SOAP สำหรับแต่ละคำร้องขอ

  • จากนั้นแทนที่ค่าที่จะส่งเป็นรหัส

  • โพสต์ข้อมูลนี้ไปยังจุดสิ้นสุดบริการโดยใช้อินสแตนซ์ DefaultHttpClient

  • รับสตรีมการตอบกลับและสุดท้าย

  • แยกวิเคราะห์ Response Stream โดยใช้ parser XML Pull



6

สำหรับฉันวิธีที่ง่ายที่สุดคือการใช้เครื่องมือที่ดีในการสร้างคลาสที่ต้องการทั้งหมด ส่วนตัวฉันใช้เว็บไซต์นี้:

http://easywsdl.com/

รองรับบริการเว็บที่ค่อนข้างซับซ้อนและใช้ ksoap2


5

ฉันขอแนะนำให้ตรวจสอบเครื่องมือที่มีประโยชน์มากที่ช่วยฉันได้มาก ผู้ชายที่ดูแลโครงการนั้นก็มีประโยชน์เช่นกัน www.wsdl2code.com/


5

หากคุณมีปัญหาเกี่ยวกับการเรียกใช้บริการเว็บใน Android แล้วคุณสามารถใช้รหัสด้านล่างเพื่อเรียกบริการเว็บและได้รับการตอบสนอง ตรวจสอบให้แน่ใจว่าบริการเว็บของคุณส่งคืนการตอบสนองในรูปแบบตารางข้อมูล .. รหัสนี้จะช่วยคุณถ้าคุณใช้ข้อมูลจากฐานข้อมูลSQL Server หากคุณใช้MYSQLคุณต้องเปลี่ยนสิ่งหนึ่งเพียงแทนที่คำ 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
        }
    }

หากคุณมีปัญหาใด ๆ เกี่ยวกับเรื่องนี้คุณสามารถเขียนฉัน ..


4

โปรดดาวน์โหลดและเพิ่มไฟล์ไลบรารี 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/

ขอบคุณ


3

นี่เป็นตัวอย่างของการใช้ SOAP web services ใน android

** หมายเหตุ :: *** อย่าลืมเพิ่ม ksoap2.jar ในโครงการของคุณและเพิ่มสิทธิ์อินเทอร์เน็ตในไฟล์ 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();
    }
}

โปรดช่วยฉันเกี่ยวกับปัญหานี้stackoverflow.com/questions/41573829/…
Edijae Crusar

3

คุณสามารถทำการโทรด้วยสบู่เป็นโพสต์บน http ด้วยส่วนหัวที่แน่นอน ฉันแก้ไขคำถามนี้โดยไม่ต้องมีห้องสมุดเพิ่มเติมเช่น ksoap2 นี่คือรหัสสดที่ได้รับคำสั่งจากบริการสบู่

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

โปรดช่วยได้ที่นี่stackoverflow.com/questions/41573829/…
Edijae Crusar

คำถามสองข้อเกี่ยวกับเรื่องนี้ 1. กิจกรรมนี้ถูกเรียกมาจากกิจกรรมหลักอย่างไร 2. สิ่งที่ควรเป็นมูลค่าของ StringUrlShipment ที่ส่งผ่านเป็นพารามิเตอร์
Tori

ในความคิดเห็นข้างต้นละเว้นคำถาม # 1
Tori

จากกิจกรรมหลักคุณควรใช้ AsyncTask เพื่อเรียกรหัสนี้ ภายในคลาส AsyncTask ใช้ doInBackground เพื่อเปิดใช้รหัสนี้
Lapenkov Vladimir

2

หากต้องการเรียกใช้บริการเว็บ SOAP จากแอนดรอยด์ลองใช้ไคลเอ็นต์นี้

อย่าลืมเพิ่ม ksoap2-android.jar ในพา ธ การสร้าง java ของคุณ

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 วิธีการเปรียบเทียบการตอบสนอง res จากผลการตอบสนองของผู้ให้: - สำเร็จ ..... "responce = 1 ~ Successfull" .... ดังนั้นเราจึงเปรียบเทียบผลลัพธ์ที่ได้จากสภาพที่มาจากฝั่งเซิร์ฟเวอร์ ...... ..
Amitsharma

1

เพิ่ม Soap Libaray ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar):

สตริงคงที่สาธารณะ 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;
    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.