কীভাবে জাভা ক্লাস থেকে একটি এসওএপি ওয়েব পরিষেবা কল করবেন?


116

আমি ওয়েব সার্ভিসেস ওয়ার্ল্ডে আপেক্ষিকভাবে নতুন এবং আমার গবেষণাটি আমাকে আলোকিত করার চেয়ে আরও বিভ্রান্ত করেছে বলে মনে হয়, আমার সমস্যাটি হ'ল আমাকে একটি লাইব্রেরি (জার) দেওয়া হয়েছিল যা আমাকে কিছু ওয়েবসার্চ কার্যকারিতা দিয়ে প্রসারিত করতে হয়েছিল।

এই গ্রন্থাগারটি অন্যান্য বিকাশকারীদের সাথে ভাগ করা হবে, এবং জারের ক্লাসগুলির মধ্যে এমন একটি ক্লাস থাকবে যাতে একটি পদ্ধতি রয়েছে যা ওয়েবসার্ভিস বলে (এটি ক্লাসটির একটি বৈশিষ্ট্য নির্ধারণ করে, কিছু ব্যবসায়িক যুক্তি দেয়, যেমন কোনও ডিবিতে স্টোর সংরক্ষণ করে, ইত্যাদি এবং সেই পরিবর্তনগুলির সাথে অবজেক্টটিকে প্রেরণ করে)। আমি এই পরিষেবায় যতটা সম্ভব সহজ কল্পনা করতে চাই, আশা করি এত সহজ যে ক্লাসটি ব্যবহার করে বিকাশকারীকে কেবল তার প্রয়োজন need

Car c = new Car("Blue");
c.webmethod();

আমি সার্ভারে জাএক্স-ডাব্লুএস পড়ার জন্য অধ্যয়ন করছি কিন্তু আমার কাছে মনে হয় যে আমার wsimportসার্ভারে বা wsimportক্লায়েন্টে কোনও তৈরি করার দরকার নেই , যেহেতু আমি জানি যে উভয়ের ক্লাস রয়েছে তাই ক্লাসগুলির মধ্যে আমার কিছুটা ইন্টারঅ্যাকশন দরকার সার্ভার এবং ক্লায়েন্ট উভয়েই ভাগ করে নিয়েছে। ক্লাসে ওয়েব সার্ভিস এবং কল করতে কীভাবে আপনি বোধ করেন?


আপনার প্রশ্নটি কিছুটা অস্পষ্ট। আপনি যে পদ্ধতিটি তৈরি করতে চান তা (1) ওয়েব পরিষেবা থেকে বস্তুটি পাবে; (২) বস্তুটির সাথে সামান্য কাজ করুন; এবং (3) এটি ওয়েব পরিষেবাতে আবার পোস্ট করুন। এইটাই কি সেইটা?
acdcjunior

না, ক্লায়েন্টে অবজেক্টটি তৈরি করা হবে, ডাকে ডাব্লুএস-তে পাঠানো হবে, ডাব্লুএস একটি ভেরিয়েবল সেট করবে, উদাহরণস্বরূপ কারেন্টটাইম, কিছু ব্যবসায়িক যুক্তি এটি ডিবিতে সঞ্চয় করতে পছন্দ করে, এবং তারপরে অবজেক্টটি প্রেরণ করা হবে বর্তমান সেট এখন ক্লায়েন্ট ফিরে। আশা করি আমি আমার আত্মাকে আরও ভালভাবে ব্যাখ্যা করেছি। ধন্যবাদ.
jpz

উত্তর:


273

আমি বুঝতে পারছি আপনার সমস্যা নিচে boils কিভাবে জাভা থেকে একটি সোপ (Jax-ডব্লুএস) ওয়েব পরিষেবা কল এবং তার ফিরে বস্তুর পেতে । সেক্ষেত্রে আপনার দুটি সম্ভাব্য পন্থা রয়েছে:

  1. জাভা ক্লাসগুলি তৈরি করে wsimportতাদের ব্যবহার করুন; অথবা
  2. একটি এসওএপি ক্লায়েন্ট তৈরি করুন:
    1. এক্সএমএলে পরিষেবাটির পরামিতিগুলি সিরিয়াল করে;
    2. এইচটিটিপি ম্যানিপুলেশন মাধ্যমে ওয়েব পদ্ধতি কল; এবং
    3. প্রত্যাবর্তনকারী এক্সএমএল প্রতিক্রিয়াটিকে কোনও বস্তুর মধ্যে আবার পার্স করুন।


প্রথম পদ্ধতির সম্পর্কে (ব্যবহার করে wsimport):

আমি দেখতে পাচ্ছি যে আপনার কাছে ইতিমধ্যে পরিষেবাদিগুলির (সত্তা বা অন্যান্য) ব্যবসায়িক ক্লাস রয়েছে, এবং এটি একটি সত্য যে wsimportক্লাসগুলির সম্পূর্ণ নতুন সেট তৈরি করা হয় (এটি আপনার ইতিমধ্যে ক্লাসগুলির কোনওরকম নকল)।

আমি ভয় পাচ্ছি, যদিও এই পরিস্থিতিতে আপনি কেবলমাত্র:

  • wsimportউত্পন্ন কোডটিকে এটিকে আপনার ব্যবসায়িক ক্লাসগুলি ব্যবহার করার জন্য অভিযোজিত (সম্পাদনা) করুন (এটি কঠিন এবং কোনওভাবেই এটির পক্ষে মূল্যহীন নয় - ডাব্লুএসডিএল পরিবর্তিত হওয়ার সাথে সাথে মনে রাখবেন, আপনাকে কোডটি পুনরায় জেনারেট করতে হবে এবং পুনরায় তৈরি করতে হবে); অথবা
  • wsimportউত্পন্ন ক্লাসগুলি ছেড়ে দিন এবং ব্যবহার করুন । (এই সমাধানে, আপনার ব্যবসায়ের কোডটি অন্য স্থাপত্য স্তর থেকে পরিষেবা হিসাবে উত্পন্ন ক্লাসগুলি "ব্যবহার" করতে পারে))

দ্বিতীয় পদ্ধতির সম্পর্কে (আপনার কাস্টম এসওএপি ক্লায়েন্ট তৈরি করুন):

দ্বিতীয় পদ্ধতির প্রয়োগ করতে, আপনাকে এগুলি করতে হবে:

  1. কল করুন:
    • কল করার জন্য SAAJ (জাভা জন্য সংযুক্তি এপিআই সহ এসওপি) ব্যবহার করুন (নীচে দেখুন, এটি জাভা এসই 1.6 বা তারপরে প্রেরণ করা হয়েছে) কলগুলি করতে; অথবা
    • আপনি এটি java.net.HttpUrlconnection(এবং কিছু java.ioপরিচালনা) এর মাধ্যমেও করতে পারেন ।
  2. এক্সএমএল থেকে অবজেক্টগুলিকে এতে এবং পিছনে ঘুরিয়ে দিন:
    • এক্সএমএলকে অবজেক্ট / ইন / থেকে সিরিয়ালাইজ করতে / ডিজিটালাইজ করতে JAXB এর মতো একটি OXM (XML ম্যাপিংয়ের জন্য অবজেক্ট) ফ্রেমওয়ার্ক ব্যবহার করুন
    • অথবা, যদি আপনাকে অবশ্যই XML টি ম্যানুয়ালি তৈরি / বিশ্লেষণ করে (যদি প্রাপ্ত বস্তুটি প্রেরিতটির থেকে সামান্য কিছুটা পৃথক হয় তবে এটি সেরা সমাধান হতে পারে)।

ক্লাসিক ব্যবহার করে একটি এসওএপি ক্লায়েন্ট তৈরি java.net.HttpUrlConnectionকরা তেমন শক্ত নয় (তবে এটি সাধারণও নয়) এবং আপনি এই লিঙ্কটিতে একটি খুব ভাল সূচনা কোড খুঁজে পেতে পারেন ।

আমি আপনাকে SAAJ কাঠামোটি ব্যবহার করার পরামর্শ দিচ্ছি:

জাভা (SAAJ) এর জন্য সংযুক্তিগুলির সাথে সংযুক্ত এসওএপি মূলত এসওএপি অনুরোধ / প্রতিক্রিয়া বার্তাগুলির সাথে সরাসরি ডিল করার জন্য ব্যবহৃত হয় যা কোনও ওয়েব সার্ভিস এপিআইতে পর্দার আড়ালে ঘটে। এটি বিকাশকারীদের জ্যাক-ডাব্লুএস ব্যবহার না করে সরাসরি সাবান বার্তা প্রেরণ এবং গ্রহণের অনুমতি দেয়।

SAAJ ব্যবহার করে একটি সোপ ওয়েব পরিষেবা কলের একটি কার্যকারী উদাহরণ (এটি চালান!) দেখুন। এটি এই ওয়েব পরিষেবাটিকে কল করে ।

import javax.xml.soap.*;

public class SOAPClientSAAJ {

    // SAAJ - SOAP Client Testing
    public static void main(String args[]) {
        /*
            The example below requests from the Web Service at:
             https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit


            To call other WS, change the parameters below, which are:
             - the SOAP Endpoint URL (that is, where the service is responding from)
             - the SOAP Action

            Also change the contents of the method createSoapEnvelope() in this class. It constructs
             the inner part of the SOAP envelope that is actually sent.
         */
        String soapEndpointUrl = "https://www.w3schools.com/xml/tempconvert.asmx";
        String soapAction = "https://www.w3schools.com/xml/CelsiusToFahrenheit";

        callSoapWebService(soapEndpointUrl, soapAction);
    }

    private static void createSoapEnvelope(SOAPMessage soapMessage) throws SOAPException {
        SOAPPart soapPart = soapMessage.getSOAPPart();

        String myNamespace = "myNamespace";
        String myNamespaceURI = "https://www.w3schools.com/xml/";

        // SOAP Envelope
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI);

            /*
            Constructed SOAP Request Message:
            <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myNamespace="https://www.w3schools.com/xml/">
                <SOAP-ENV:Header/>
                <SOAP-ENV:Body>
                    <myNamespace:CelsiusToFahrenheit>
                        <myNamespace:Celsius>100</myNamespace:Celsius>
                    </myNamespace:CelsiusToFahrenheit>
                </SOAP-ENV:Body>
            </SOAP-ENV:Envelope>
            */

        // SOAP Body
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("CelsiusToFahrenheit", myNamespace);
        SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("Celsius", myNamespace);
        soapBodyElem1.addTextNode("100");
    }

    private static void callSoapWebService(String soapEndpointUrl, String soapAction) {
        try {
            // Create SOAP Connection
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection soapConnection = soapConnectionFactory.createConnection();

            // Send SOAP Message to SOAP Server
            SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(soapAction), soapEndpointUrl);

            // Print the SOAP Response
            System.out.println("Response SOAP Message:");
            soapResponse.writeTo(System.out);
            System.out.println();

            soapConnection.close();
        } catch (Exception e) {
            System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n");
            e.printStackTrace();
        }
    }

    private static SOAPMessage createSOAPRequest(String soapAction) throws Exception {
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();

        createSoapEnvelope(soapMessage);

        MimeHeaders headers = soapMessage.getMimeHeaders();
        headers.addHeader("SOAPAction", soapAction);

        soapMessage.saveChanges();

        /* Print the request message, just for debugging purposes */
        System.out.println("Request SOAP Message:");
        soapMessage.writeTo(System.out);
        System.out.println("\n");

        return soapMessage;
    }

}

সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশনের জন্য জ্যাকএক্সবি ব্যবহার সম্পর্কে এটি সম্পর্কে তথ্য পাওয়া খুব সহজ। আপনি এখানে শুরু করতে পারেন: http://www.mkyong.com/java/jaxb-hello-world-example/


আমি উপরে উল্লিখিত পদ্ধতিটি ব্যবহার করে কীভাবে সাবান সংস্করণ সেট করব?

আমি আপনার পদ্ধতিটি ব্যবহার করতে সক্ষম হয়েছি এবং এটি যখন আমি আপনার ইউআরআই ব্যবহার করি তখন এটি কাজ করে তবে আমার নিজের এসওএপি অনুরোধের জন্য আমি একটি প্রতিক্রিয়া পাই যার দ্বারা মানগুলির কোনওটি প্রত্যাশিত হিসাবে দেখানো হয় না, অর্থাত্ <xsd:element name="Incident_Number" type="xsd:string"/>। আপনি দেখতে পাচ্ছেন, উপাদানটি বন্ধ রয়েছে এবং ডাব্লুএস থেকে কোনও তথ্য উত্পন্ন হয় না।
মার্টিন এরলিক

GetInfoByCityহয় 503Service Unavailable, এটা seeems। :(
ব্র্যাড টুরেক

@ ব্র্যাড টুরেক ডি * এমএন! আমি শুধু এটি প্রতিস্থাপন। আমাকে জানতে দেওয়ার জন্য ধন্যবাদ! আমি অন্য একটি খুঁজে পেতে এবং এটি কিছুটা পরিবর্তন করব।
acdcjunior

1
পথচারীদের কাছে: যদি উপরের কোডটি (উদাহরণস্বরূপ এসওএপি ওয়েব পরিষেবা শেষ পয়েন্ট) কাজ করা বন্ধ করে দেয় বা এর্রগুলি দেওয়া শুরু করে (যেমন 500, 503 ইত্যাদি), দয়া করে আমাকে জানান যাতে আমি এটি ঠিক করতে পারি।
acdcjunior

3

অথবা আপনি যে জিনিসগুলি ব্যবহার করতে পারেন তা তৈরি করতে কেবল অ্যাপাচি সিএক্সএফ এর ডাব্লুএসডিএল 2 জাভা ব্যবহার করুন।

এটি বাইনারি প্যাকেজের অন্তর্ভুক্ত রয়েছে আপনি তাদের ওয়েবসাইট থেকে ডাউনলোড করতে পারেন। আপনি সহজেই এরকম একটি কমান্ড চালাতে পারেন:

$ ./wsdl2java -p com.mynamespace.for.the.api.objects -autoNameResolution http://www.someurl.com/DefaultWebService?wsdl

এটা তোলে wsdl ব্যবহার বস্তু জেনারেট করতে তোমার মতোই ব্যবহার করতে পারেন যা এই (বস্তুর নাম এছাড়াও wsdl থেকে ধরলাম যাতে পুলিশের বিভিন্ন একটু হবে):

DefaultWebService defaultWebService = new DefaultWebService();
String res = defaultWebService.getDefaultWebServiceHttpSoap11Endpoint().login("webservice","dadsadasdasd");
System.out.println(res);

এমনকি মাভেন প্লাগ-ইন রয়েছে যা উত্স উত্পন্ন করে: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html

দ্রষ্টব্য: আপনি যদি সিএক্সএফ এবং আইডিইএ ব্যবহার করে উত্স তৈরি করেন তবে আপনি এটি দেখতে চাইতে পারেন: https://stackoverflow.com/a/46812593/840315


1
আমার অ্যাপ্লিকেশনটিতে আমার কাছে 30+ ডাব্লুএসডিএল রয়েছে। মাত্র 1 ডাব্লুএসডিএল (যার 5 টি সাপঅ্যাকশন রয়েছে) এর জন্য সংস্থান তৈরি করার সময়, আমার Eclipse IDE ফাঁসিয়ে দিয়েছে এবং প্রায় 100+ এমবি ক্লাস / অবজেক্ট তৈরি করেছে।
Manmohan_singh

-1

আমি সাবান বার্তা উত্পন্ন করার জন্য একটি খুব সহজ বিকল্প উপায় পেয়েছি। একটি ব্যক্তি অবজেক্ট দেওয়া হয়েছে:

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
  private String name;
  private int age;
  private String address; //setter and getters below
}

নীচে একটি সাধারণ সাবান বার্তা জেনারেটর রয়েছে:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

@Slf4j
public class SoapGenerator {

  protected static final ObjectMapper XML_MAPPER = new XmlMapper()
      .enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)
      .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
      .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
      .registerModule(new JavaTimeModule());

  private static final String SOAP_BODY_OPEN = "<soap:Body>";
  private static final String SOAP_BODY_CLOSE = "</soap:Body>";
  private static final String SOAP_ENVELOPE_OPEN = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
  private static final String SOAP_ENVELOPE_CLOSE = "</soap:Envelope>";

  public static String soapWrap(String xml) {
    return SOAP_ENVELOPE_OPEN + SOAP_BODY_OPEN + xml + SOAP_BODY_CLOSE + SOAP_ENVELOPE_CLOSE;
  }

  public static String soapUnwrap(String xml) {
    return StringUtils.substringBetween(xml, SOAP_BODY_OPEN, SOAP_BODY_CLOSE);
  }
}

আপনি এর মাধ্যমে ব্যবহার করতে পারেন:

 public static void main(String[] args) throws Exception{
        Person p = new Person();
        p.setName("Test");
        p.setAge(12);

        String xml = SoapGenerator.soapWrap(XML_MAPPER.writeValueAsString(p));
        log.info("Generated String");
        log.info(xml);
      }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.