1

我从 perl 客户端(activePerl 5.16)调用 java 端点(下面的代码)有问题。这些代码片段来自 Java Web Services Up And Running 一书

package ch01.ts;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style=Style.RPC)
public interface TimeServer {

    @WebMethod
    String getTimeAsString();

    @WebMethod
    long getTimeAsElapsed();
}

package ch01.ts;

import java.util.Date;
import javax.jws.WebService;

@WebService(endpointInterface="ch01.ts.TimeServer")
public class TimeServerImpl implements TimeServer {

    public String getTimeAsString() {
        return new Date().toString();
    }

    public long getTimeAsElapsed() {
        return new Date().getTime();
    }
}

package ch01.ts;

import javax.xml.ws.Endpoint;

public class TimeServerPublisher {
    public static void main(String[] args) {
         Endpoint.publish("http://127.0.0.1:9876/ts", new TimeServerImpl());
    }
}

和 perl 消费者:

use SOAP::Lite;

my $url = 'http://127.0.0.1:9876/ts?wsdl';
my $service = SOAP::Lite->service($url);

print "\nCurrent time is: ",$service->getTimeAsString();
print "\nElapsed miliseconds from the epoch: ", $service->getTimeAsElapsed();

当我调用 Web 服务时,我有这个堆栈跟踪:

maj 04, 2013 10:21:40 AM com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit    handle
SEVERE: Couldn't create SOAP message. Expecting Envelope in namespace     http://schemas.xmlsoap.org/soap/envelope/, but got http://schemas.xmlsoap.org/wsdl/soap/
com.sun.xml.internal.ws.protocol.soap.VersionMismatchException: Couldn't create SOAP   message. Expecting Envelope in namespace http://schemas.xmlsoap.org/soap/envelope/, but got   http://schemas.xmlsoap.org/wsdl/soap/
at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(Unknown Source)

我认为soap版本是问题所在,上面的例子是从1.1开始的,当我将客户端代码更改为

my $service = SOAP::Lite->service($url)->soapversion('1.2');

然后抛出不同的错误

com.sun.xml.internal.ws.server.UnsupportedMediaException: Unsupported Content-Type: application/soap+xml; charset=utf-8 Supported ones are: [text/xml]

我需要帮助处理信封问题或内容类型。我将不胜感激任何方向,代码和其他任何可以提供帮助的东西。

4

1 回答 1

0

I am not quite sure of Perl->Soap API, But for first case where client version is 1.1 may be you need to mention namespace also somewhere.

May be like

server->setNamespace() //or
SOAP::Lite->service($url,"<namespace>"); //please search for perl web service client         examples

And for second case(1.2) service is expecting text and your api sends soap encoding or something.

Refer http://www.herongyang.com/Web-Services/Perl-SOAP-1-2-Unsupported-Media-Type-application-soap.html

This may be helpful

  my $client = SOAP::Lite->new()
  ->soapversion('1.2')
  ->envprefix('soap12')
  ->default_ns('http://xmlme.com/WebServices')
  ->on_action( sub {join '/', @_} )
  ->readable(true)
  ->proxy('http://www.xmlme.com/WSShakespeare.asmx');

and

http://www.herongyang.com/Web-Services/Perl-SOAP-1-2-Request-Differences-SOAP-1-1-and-1-2.html

Hope it helps

于 2013-05-04T09:43:36.700 回答