如何将数据从网页发送到XML然后发送到SOAP Web服务

如何将数据从网页发送到XML然后发送到SOAP Web服务

问题描述:

Till now, we had a backend SOAP web service for our application which used xml input to hit the service. But now we are trying to build the front end which takes a few inputs from the user and updates only the xml atomic values accordingly, as we have the xml structure already. After the xml is updated from user values the service should hit with that xml as the input.

So the flow will be like: user input(html) --> update xml --> pass this xml as input to SOAP web service --- service response.

I have no idea what technologies can be used for this and how can it be done, for updating the xml I started with php and xpath, I don't know if I am right. Can anyone please help me with this and suggest the solution?

Also, my xml has soap headers, so I am having trouble using this xml with xpath, as xpath uses pure xml. Any solution on this too?

java, springs is used for backend development.

It's difficult to provide a precise answer without knowing the exact environment you're working with (target web service, preferred programming language, etc.). But I'll attempt a general answer.

Consuming the Web Service

SOAP webservices often (always?) provide a machine-readable description which can be "consumed" by some tool, generating code in your favorite language to interact with the API.

For example, Salesforce offers a description of their SOAP API, customized for a given account, in the form of a WSDL (Web Service Description Language) file. It is XML, like SOAP requests/responses. For my applications, I have used Visual Studio to create a reference in my project to Salesforce's API using the WSDL file. The rest is done with simple object initialization and methods. For example:

using ServiceName;  // Namespace generated by Visual Studio using the WSDL.

var client = new ServiceClient("username", "password");

client.Create(new ServiceThing("information", "about the new thing"));

This example in C#-like syntax would call the SOAP API to create some object with the given information. The details of the network request are completely hidden.

To learn how to consumer your target API's services, search for something like "consume WSDL in [language of your choice]". Even better, see if the target web service has documentation describing how to consume it.

Sending Data from Web Page

There are any number of tools to retrieve information from an HTTP POST request and act upon it. I'm most familiar with ASP.NET. You seem familiar with PHP.

To keep things simple, you'll want to try to consume the target web service using the same language as your web service that receives input from the user. I'll provide an ASP.NET-like example which hopefully you can translate to your preferred tools:

protected void Page_Load(object sender, EventArgs e) 
{
    if (Page.IsPostback)
    {
        // a and b are names of input fields in our page.
        string a = Request["a"];
        string b = Request["b"];

       // Let's assume we've initialized the web service client as a property.
       Client.Create(new ServiceThing(a, b));
    }
}

There you go. No manual XML editing necessary. The SOAP XML is automatically generated based on your ServiceThing object and send to your target web service.

Again, this is a general answer to a general question. If you update your question with more specifics, I'll try to edit this answer with more targeted details.

If you have java platform then this solution will be helpful to you. For this purpose I've created new web application project and used Web Service Wrom WSDL wizard in Web Services category. The implementation was easy:

@WebService(serviceName = "AddNumbersService", portName = "AddNumbersPort", endpointInterface = "org.example.duke.AddNumbersPortType",
            targetNamespace = "http://duke.example.org", wsdlLocation = "WEB-INF/wsdl/AddNumbersImpl/AddNumbers.wsdl")
public class AddNumbersImpl implements AddNumbersPortType {

    public int addNumbers(int arg0, int arg1) throws AddNumbersFault {
        int result = arg0+arg1;
        if (result < 0) {
            org.example.duke.xsd.AddNumbersFault fault = new org.example.duke.xsd.AddNumbersFault();
            fault.setMessage("the result is negative");
            fault.setFaultInfo("negative result: "+result);
            throw new AddNumbersFault("error", fault);
        } else {
            return result;
        }
    }

    public void oneWayInt(int arg0) {
        System.out.println("JAX-WS: oneWayInt request "+arg0);
    }

}