草庐IT

java - Java soap调用以将.XML文件传递给WebService

coder 2024-07-04 原文

所以我对整个soap和服务器概念还不熟悉。我把一个基本的jax-rpc和jax-ws组合在一起。我总的来说想把一个.xml文件传递给一个web服务,接收一个响应,并将其写入一个目录。我从哪里开始,应该使用什么,在哪里可以找到基于它的教程/信息。谢谢您!

最佳答案

实际上,在设计web服务时可以采用两种方法。自上而下和自下而上的方法。我将给你一个简单的解释,这两种方法及其兴衰。还有一些教程的链接。
自顶向下:
在自顶向下的方法中,首先要对xsd进行建模,xsd将包含您的请求和响应消息以及这些请求和响应将使用的数据结构。然后对操作进行建模,即在客户机和服务之间流动的请求和响应,最后将其组合成wsdl。然后将生成的wsdl导入到ide中,如netbeans或eclipse,然后开始编写服务的内部代码。
例如,假设您有一个产品服务。在此服务中,您希望创建一个操作,该操作将基于产品代码搜索特定产品。因此,您需要查询产品服务中的产品对象。服务将被调用ProductService,操作将被调用GetProduct
要实现这一点,您需要对一个具有两个字符串属性的产品对象建模,这两个属性称为描述和代码。您还需要为GetProductRequest消息和GetProductResponse消息建模。
这可能具有以下结构:
xsd的代码如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns="http://www.wsexample.com/ProductService_V1/Product"
       elementFormDefault="qualified"
       targetNamespace="http://www.wsexample.com/ProductService_V1/Product"
       xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="ProductCode_Type">
    <xs:annotation>
        <xs:documentation>This the product code type. It is based on the string data type it must be 8 characters long.
</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
        <xs:minLength value="8" />
        <xs:maxLength value="8" />
    </xs:restriction>
</xs:simpleType>
<xs:simpleType name="ProductDescription_Type">
    <xs:annotation>
        <xs:documentation>This is the base class for the product description field. This is a text field up to 255 characters long.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
        <xs:maxLength value="255" />
    </xs:restriction>
</xs:simpleType>
<xs:complexType name="Product_Type">
    <xs:annotation>
        <xs:documentation>This is the product base class it is used to perform CRUD operations with on all of the product service operations.
</xs:documentation>
    </xs:annotation>
    <xs:sequence>
        <xs:element name="ProductCode"
                    type="ProductCode_Type"
                    minOccurs="1"
                    maxOccurs="1" />
        <xs:element name="ProductDescription"
                    type="ProductDescription_Type"
                    minOccurs="0"
                    maxOccurs="1" />
    </xs:sequence>
</xs:complexType>
<xs:complexType name="GetProductRequest_Type">
    <xs:annotation>
        <xs:documentation>This is the base class for the Get Product Request message. In the message you must pass one and only one product code which to search for.   </xs:documentation>
    </xs:annotation>
    <xs:sequence>
        <xs:element name="Product"
                    type="Product_Type" />
    </xs:sequence>
</xs:complexType>
<xs:complexType name="GetProductResponse_Type">
    <xs:annotation>
        <xs:documentation>This is the get product response message and will contain the result of the results of calling the getproductdescription operation on the Product service.
It will contain a product code which was passed in the Get Product Request message and optionally return one description.</xs:documentation>
    </xs:annotation>
    <xs:sequence>
        <xs:element name="Product"
                    type="Product_Type" />
    </xs:sequence>
</xs:complexType>
<xs:element name="GetProductRequest"
            type="GetProductRequest_Type" />
<xs:element name="GetProductResponse"
            type="GetProductResponse_Type" />
</xs:schema>

现在需要创建一个新的wsdl来描述服务,并在这个wsdl中使用这个xsd(我称之为product.xsd)。如您所见,我们已经建模了数据结构来传输产品对象,并且我们已经建模了服务中使用的操作。
那么,我们的wsdl可能如下所示:
这是wsdl的代码
<?xml version="1.0" encoding="utf-8"?>

 <wsdl:definitions name="ProductService"
              targetNamespace="http://wsexample.com/ProductService"
              xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
              xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
              xmlns:tns="http://wsexample.com/ProductService"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
              xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
              xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
              xmlns:ProductData="http://www.wsexample.com/Product/ProductData">
<wsdl:types>
    <xs:schema elementFormDefault="qualified"
               targetNamespace="http://wsexample.com/ProductService">
        <xs:import schemaLocation="Product.xsd"
                   namespace="http://www.wsexample.com/Product/ProductData" />
    </xs:schema>
</wsdl:types>
<wsdl:message name="GetProduct">
    <wsdl:part name="in"
               element="ProductData:GetProductRequest" />
</wsdl:message>
<wsdl:message name="GetProductRs">
    <wsdl:part name="out"
               element="ProductData:GetProductResponse" />
</wsdl:message>
<wsdl:portType name="ProductEndPoint">
    <wsdl:operation name="GetProduct">
        <wsdl:input message="tns:GetProduct" />
        <wsdl:output message="tns:GetProductRs" />
    </wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ProductServiceBinding"
              type="tns:ProductEndPoint">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
                  style="document" />
    <wsdl:operation name="GetProduct">
        <wsdl:input>
         <soap:body parts="in"
                       use="literal" />

        </wsdl:input>
        <wsdl:output>
            <soap:body parts="out"
                       use="literal" />
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:service name="ProductEndpointService">
    <wsdl:port name="ProductServiceEndPointPort"
               binding="tns:ProductServiceBinding">
        <soap:address location="http://wsexample.com/ProductService" />
    </wsdl:port>
</wsdl:service>
</wsdl:definitions>

因此,在对将在客户端和服务器之间流动的消息进行建模之后,将如下所示:
请求:
 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"   xmlns:prod="http://www.wsexample.com/Product/ProductData">
 <soapenv:Header/>
 <soapenv:Body>
   <prod:GetProductRequest>
      <prod:Product>
         <prod:ProductCode>12345678</prod:ProductCode>

      </prod:Product>
   </prod:GetProductRequest>
  </soapenv:Body>
</soapenv:Envelope>

回应:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prod="http://www.wsexample.com/Product/ProductData">
 <soapenv:Header/>
 <soapenv:Body>
    <prod:GetProductResponse>
       <prod:Product>
          <prod:ProductCode>12345678</prod:ProductCode>
          <!--Optional:-->
          <prod:ProductDescription>A Basic product for kids to teach them how to count.    </prod:ProductDescription>
       </prod:Product>
    </prod:GetProductResponse>
  </soapenv:Body>
</soapenv:Envelope>

现在,您可以使用wsdl和xsd来使用Netbeans tutorial and guide.实现web服务。它非常简单,只需在netbeans中启动一个新的web项目,然后右键单击该项目并添加新文件,然后从wsdl文件中选择web服务。
请参见下面的屏幕截图:
自上而下摘要:
自上而下需要你做很多前期的建模和规划。但是你完全可以控制。这允许您决定数据将如何在客户机和服务器之间流动。它允许您根据自己的具体要求修改所有内容。然而,这需要大量的工作前手。
我最大的好处是可以设计一个wsdl和xsd,将数据从提供系统抽象为更通用的东西。这在集成项目中变得很重要。
自下而上:
自下而上方法允许您从Java代码中生成上面创建的工件。这里有一个excellent tutorial会告诉你所有的细节。然而,Java允许您向类添加注释,然后将类及其方法公开为Web服务。
因此,通过获取类并添加注释,您可以将该类转换为web服务。请参阅下面的代码,以获取一个快速而肮脏的示例:
@Webservice
public Class CalculatorWS
{

    @WebMethod
    public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
        int k = i + j;
        return k;
    }
}

如果您遵循本教程,您可能会在几分钟内从代码转到完全工作的web服务。又快又容易。
自下而上的总结:
您几乎无法控制wsdl和xsd的外观和行为。在某些情况下,这种方法会将您紧密地绑定到底层模型。这真的取决于你如何编码。因此,使用自下而上的方法,你可以在几分钟内得到一个原型,但上下流动的信息可能并不是你所想的那样。
重要提示:
下载一个soapui副本,它确实是测试甚至创建模拟服务的最佳工具。如果你真的想使用web服务,那么现在就开始吧。
希望这能帮到你。

关于java - Java soap调用以将.XML文件传递给WebService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23787049/

有关java - Java soap调用以将.XML文件传递给WebService的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  9. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  10. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

随机推荐