【问题标题】:How can I pass complex types like objects using Webservices?如何使用 Web 服务传递对象等复杂类型?
【发布时间】:2011-04-10 18:52:14
【问题描述】:

这听起来像是一个简单的问题,但作为 Webservies 的新手,这是我第一次使用它,所以我提出了疑问。

问:如何使用 Web 服务传递对象或复杂类型?我创建了一个简单的 Web 服务并传递字符串和整数类型,但我不确定如何使用 Web 服务传递对象,因此任何指导都将受到高度赞赏。

谢谢。

【问题讨论】:

    标签: java web-services serialization soap soa


    【解决方案1】:

    您只需在服务端序列化对象(制作文本)并在接收端反序列化(再次制作对象)。多年来 SOAP 是这方面的标准,但如今 JSON 变得更流行,因为它的开销比 SOAP 少得多。

    如果使用 SOAP 和 Java,您可以尝试 Google 的 GSON,它提供了非常易于使用的编程接口。

    带有 GSON 的 JSON:

    String jsonized = new Gson().toJson( myComplexObject ); 
    /* no we have a serialized version of myComplexObject */ 
    
    myComplexObjectClass myComplexObjext = new Gson().fromJson( jsonized, myComplexObjectClass.class ); 
    /* now we have the object again */
    

    对于带有 JAX-WS 的 JSON(我们不使用 Apache Axis),请查看以下入门教程:

    【讨论】:

    • 你能分享两个这样做的例子吗,一个是 SOAP,另一个是 JSON?
    • 使用哪种编程语言?
    • Java 是我们使用的语言。
    • SOAP 对于 Java 来说要复杂得多,因为您需要为要序列化的每个类提供骨架类。您可以为此使用 Apache AXIS,但这并不容易处理!如果 JSON 确实满足您的需求,请使用 JSON。
    • 确实这没有意义 ;) Axis2 是 SOAP-Web-Services 的全功能解决方案,JSON/GSON 只是一个用于创建和解析 JSON 对象的库,因此您将拥有添加您自己的 Web 服务(通过使用 Tomcat 或 Jetty 或类似服务)以将这些序列化的 JSON 对象提供给客户端。当然,您可以创建 JSON 字符串并将其包装到 SOAP-webservice 中——但这会破坏 JSON 作为序列化对象的轻量级表示的想法。
    【解决方案2】:

    如果您使用的是 RESTful Web 服务(如果您是 http://jersey.dev.java.net,我建议您使用 Jersey),您可以传递 JAXB 注释对象。 Jersey 将在客户端和服务器端自动序列化和反序列化您的对象。

    服务器端;

    @Path("/mypath")
    public class MyResource
    {
        @GET
        @Produces(MediaType.APPLICATION_XML)
        public MyBean getBean()
        {
            MyBean bean = new MyBean();
            bean.setName("Hello");
            bean.setMessage("World");
            return bean;
        }
    
        @POST
        @Consumers(MediaType.APPLICATION_XML)
        public void updateBean(MyBean bean)
        {
            //Do something with your bean here
        }
    }
    

    客户端;

    //Get data from the server
    Client client = Client.create();
    WebResource resource = client.resource(url);
    MyBean bean = resource.get(MyBean.class);
    
    //Post data to the server
    bean.setName("Greetings");
    bean.setMessage("Universe");
    resource.type(MediaType.APPLICATION_XML).post(bean);
    

    JAXB 豆;

    @XmlRootElement
    public class MyBean
    {
        private String name;
        private String message;
    
        //Constructors and getters/setters here
    }
    

    【讨论】:

    • @qwerky = 我没有使用REST,而是SOAP,你能和SOAP分享一个例子吗?
    【解决方案3】:

    如果需要,您可以传递 json 或使用 xmlserialization。

    【讨论】:

    • 你能否详细说明你的观点,给出一些详细的解释和例子来支持这个论点,以便我更好地理解这个概念?
    猜你喜欢
    • 2013-03-16
    • 2014-10-28
    • 2016-06-12
    • 2015-01-17
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多