【问题标题】:Consume .NET web service in Codename One在 Codename One 中使用 .NET Web 服务
【发布时间】:2016-04-24 11:18:10
【问题描述】:

我是 Codename One 的初学者,我必须使用 Web 服务 (x.x.x.x/xxMobileWebService/xxService.asmx)。我已经使用 kSoap 在 android 原生开发中成功地做到了这一点。

那么有没有办法在 Codename One 中访问 .Net 网络服务?

编辑 -------------------------------- -------------------------------------------------- ----------------------

这是我的 XML 元素:

<soap:envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:soap='http://www.w3.org/2003/05/soap-envelope' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
 <soap:body>
  <getcommonalldataresponse xmlns='http://tempuri.org/'>
   <getcommonalldataresult>
    <xs:schema xmlns:msprop='urn:schemas-microsoft-com:xml-msprop' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns='' id='NewDataSet'>
     <xs:element msdata:usecurrentlocale='true' msdata:isdataset='true' name='NewDataSet'>
      <xs:complextype>
       <xs:choice maxoccurs='unbounded' minoccurs='0'>
        <xs:element name='Table' msprop:refcursorname='REFCursor'>
         <xs:complextype>
          <xs:sequence>
           <xs:element name='NAME' type='xs:string' minoccurs='0' msprop:oradbtype='126'>
           </xs:element>
          </xs:sequence>
         </xs:complextype>
        </xs:element>
       </xs:choice>
      </xs:complextype>
     </xs:element>
    </xs:schema>
    <diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>
     <newdataset xmlns=''>
      <table diffgr:id='Table1' msdata:roworder='0'>
       <name>
        'Kasthuriarachchi'
       </name>
      </table>
     </newdataset>
    </diffgr:diffgram>
   </getcommonalldataresult>
  </getcommonalldataresponse>
 </soap:body>
</soap:envelope>

我想得到的是 [name] 标签内的字符串数据('Kasthuriarachchi')。

【问题讨论】:

    标签: android ios windows-phone codenameone mobile-development


    【解决方案1】:

    如果您的网络服务返回一个 xml,您可以简单地使用代号 ConnectionRequestXMLParser。您甚至可以使用 buildRequestBody 构建您的肥皂主体并发布它。

    以下是我过去用来处理此问题的代码:

    final String body = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
           + "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n"
           + "                 xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \n"
           + "                 xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\n"
           + "    <soap12:Body>\n"
           + "        <DoStuff xmlns=\"http://tempuri.org/\">\n"
           + "            <SomeVariables>blablabla</SomeVariables>\n"
           + "        </DoStuff>\n"
           + "    </soap12:Body>\n"
           + "</soap12:Envelope>\n";
    
    ConnectionRequest req = new ConnectionRequest() {
        @Override
        protected void buildRequestBody(OutputStream os) throws IOException {
            super.buildRequestBody(os);
            os.write(body.getBytes("utf-8"));
        }
    
        @Override
        protected void handleException(Exception err) {
            Dialog.show("", "Connection lost, please check your internet and try again", "Ok", null);
        }
    };
    
    req.setUrl("Your_URL_Here");
    req.addRequestHeader("Content-Type", "text/xml; charset=utf-8"); //application/soap+xml
    req.addRequestHeader("Content-Length", body.length() + "");
    req.setPost(true);
    
    InfiniteProgress prog = new InfiniteProgress();
    Dialog dlg = prog.showInifiniteBlocking();
    req.setDisposeOnCompletion(dlg);
    NetworkManager.getInstance().addToQueueAndWait(req);
    byte[] data = req.getResponseData();
    
    try {
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        InputStreamReader reader = new InputStreamReader(bais);
        XMLParser parser = new XMLParser();
        Element elem = parser.parse(reader);
        String name = ((Element) elem.getDescendantsByTagName("name").firstElement()).getChildAt(0).getText();
        System.out.println(name);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    

    从以下位置读取name标签值的XML响应:

    <soap:envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:soap='http://www.w3.org/2003/05/soap-envelope' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
     <soap:body>
      <getcommonalldataresponse xmlns='http://tempuri.org/'>
       <getcommonalldataresult>
        <xs:schema xmlns:msprop='urn:schemas-microsoft-com:xml-msprop' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns='' id='NewDataSet'>
         <xs:element msdata:usecurrentlocale='true' msdata:isdataset='true' name='NewDataSet'>
          <xs:complextype>
           <xs:choice maxoccurs='unbounded' minoccurs='0'>
            <xs:element name='Table' msprop:refcursorname='REFCursor'>
             <xs:complextype>
              <xs:sequence>
               <xs:element name='NAME' type='xs:string' minoccurs='0' msprop:oradbtype='126'>
               </xs:element>
              </xs:sequence>
             </xs:complextype>
            </xs:element>
           </xs:choice>
          </xs:complextype>
         </xs:element>
        </xs:schema>
        <diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>
         <newdataset xmlns=''>
          <table diffgr:id='Table1' msdata:roworder='0'>
           <name>
            'Kasthuriarachchi'
           </name>
          </table>
         </newdataset>
        </diffgr:diffgram>
       </getcommonalldataresult>
      </getcommonalldataresponse>
     </soap:body>
    </soap:envelope>
    

    【讨论】:

    • 非常感谢!钻石先生。
    • 先生。模拟器上的钻石效果很好。但是当我在实际设备上尝试时,会出现 [ 400 : bad request ] 错误。有什么想法吗?
    • 请发布一些代码...在您的问题下将其命名为编辑。用占位符替换敏感信息。您在 iOS 上进行测试吗?
    • 尝试将您的手机连接到 Android ddms 以检查您的应用是否显示特定错误。
    • 我已经编辑了答案以包括阅读您发布的 xml 响应,您可能需要去掉单引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多