我正在尝试使用 KSoap2 Android 将复杂对象上传到 WCF 网络服务,但在执行此操作时遇到了一些困难。当我使用 SoapUI 并手动填写数据时,我已经成功调用了 web 服务。成功的 SoapUI 生成的请求如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:fpm="http://schemas.datacontract.org/2004/07/FPMobileServices">
<soapenv:Header/>
<soapenv:Body>
<tem:CommitOne>
<tem:qr>
<fpm:ClientID>8aa2f6a4-4d15-4b4c-9cac-fb2478d0d27a</fpm:ClientID>
<fpm:CreatedBy>admin</fpm:CreatedBy>
<fpm:CreatedDate>2012-03-01T19:50:37</fpm:CreatedDate>
<fpm:DimensionID>8a02a339-b5a7-4c76-b95f-5891ef57736d</fpm:DimensionID>
<fpm:ImageID>b76c7bcc-a8f8-49ff-94c6-08cd2e05b1a8</fpm:ImageID>
<fpm:IndicatorID>4637b333-701d-4d03-a708-4de48569be84</fpm:IndicatorID>
<fpm:LoanOperationNumber>6-2011-72978</fpm:LoanOperationNumber>
<fpm:ModifiedBy>admin</fpm:ModifiedBy>
<fpm:ModifiedDate>2012-03-01T19:50:37</fpm:ModifiedDate>
<fpm:QuestionaireCompletedDate>2012-03-01T19:50:54</fpm:QuestionaireCompletedDate>
<fpm:QuestionnaireID>99967f70-8161-4922-929f-03136a389ba6</fpm:QuestionnaireID>
<fpm:ResultID>95fa03b5-80af-479d-9dec-f2bf94baf3cd</fpm:ResultID>
<fpm:ResultWeighting>0</fpm:ResultWeighting>
<fpm:StatusLevelID>03a91cd6-93cd-4503-a676-efa2967e82a7</fpm:StatusLevelID>
<fpm:UploadID>141D6A1F-8FFD-4CA4-8073-009338F22B13</fpm:UploadID>
</tem:qr>
</tem:CommitOne>
</soapenv:Body>
</soapenv:Envelope>
我的Java代码生成的请求是:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<CommitOne xmlns="http://tempuri.org/" id="o0" c:root="1">
<qr>
<ClientID>8aa2f6a4-4d15-4b4c-9cac-fb2478d0d27a</ClientID>
<LoanOperationNumber>6-2011-72978</LoanOperationNumber>
<CreatedBy i:null="true" />
<CreatedDate>2012-03-01T19:50:37</CreatedDate>
<DimensionID>8a02a339-b5a7-4c76-b95f-5891ef57736d</DimensionID>
<ImageID>b76c7bcc-a8f8-49ff-94c6-08cd2e05b1a8</ImageID>
<IndicatorID>4637b333-701d-4d03-a708-4de48569be84</IndicatorID>
<ModifiedBy i:null="true" />
<ModifiedDate i:null="true" />
<QuestionnaireCompletedDate>2012-03-01T19:50:54</QuestionnaireCompletedDate>
<QuestionnaireID>99967f70-8161-4922-929f-03136a389ba6</QuestionnaireID>
<ResultID i:type="d:string">95fa03b5-80af-479d-9dec-f2bf94baf3cc</ResultID>
<ResultWeighting>0</ResultWeighting>
<StatusLevelID>03a91cd6-93cd-4503-a676-efa2967e82a7</StatusLevelID>
<UploadID i:type="d:string">8ffa3665-b691-486f-91a0-ebbe8575896c</UploadID>
</qr>
</CommitOne>
</v:Body>
两者之间的主要区别似乎是前缀/命名空间。出于某种原因,当“qr”对象到达我的 .NET 代码时,它的所有属性都为空/零。
我在我的 java 代码中尝试了 2 种不同的方法,试图将我的“qr”对象设置为 PropertyInfo:
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
// build request object
PropertyInfo qrPi = new PropertyInfo();
qrPi.setName("qr");
qrPi.setType(qr.getClass());
qrPi.setValue(qr);
request.addProperty(qrPi);
还将我的“qr”设置为 SoapObject,然后使用 .addProperty:
SoapObject result = new SoapObject(NAMESPACE, "qr");
result.addProperty("ClientID", (String) qr.getClientID());
result.addProperty("CreatedBy", (String) qr.getCreatedBy());
result.addProperty("CreatedDate", (String) qr.getCreatedDate());
result.addProperty("DimensionID", (String) qr.getDimensionID());
result.addProperty("ImageID", (String) qr.getImageID());
result.addProperty("IndicatorID", (String) qr.getIndicatorID());
result.addProperty("LoanOperationNumber", (String) qr.getLoanOperationNumber());
result.addProperty("ModifiedBy", (String) qr.getModifiedBy());
result.addProperty("ModifiedDate", (String) qr.getModifiedDate());
result.addProperty("QuestionnaireCompletedDate", (String) qr.getQuestionnaireCompletedDate());
result.addProperty("QuestionnaireID", (String) qr.getQuestionnaireID());
result.addProperty("ResultID", (String) qr.getResultID());
result.addProperty("ResultWeighting", qr.getResultWeighting());
result.addProperty("StatusLevelID", (String) qr.getStatusLevelID());
result.addProperty("UploadID", (String) qr.getUploadID());
request.addSoapObject(result);
但是这两种方法都得到了相同的结果——当我的“qr”对象进入我的网络服务时,它的所有字段都是空的。我一直在 StackOverflow 上寻找类似的问题,找到了 this但我不知道如何将它应用到我自己的案例中。
任何人都可以帮助阐明这种情况吗?
最佳答案
不确定我是否应该回答我自己的问题,但我已经想出了一个解决方案并将它留在这里供有类似问题的任何人使用。
关键是命名空间不同。在 SoapUI 生成的示例中,我们可以看到子元素(ClientID 等)使用 fpm 命名空间,而它们上方的元素使用 tem 命名空间。为了明确指定这些子元素的 namespace ,我改变了上面讨论的第二种方法 - 我为每个子元素创建了 PropertyInfo 对象并将它们添加到 SoapObject。
而不是使用:
result.addProperty(String "ClientID", Object qr.getClientID());
我用过:
PropertyInfo pi = new PropertyInfo();
pi.setNamespace(QR_NAMESPACE);
pi.setType(PropertyInfo.STRING_CLASS);
pi.setName("ClientID");
pi.setValue(qr.getClientID());
result.addProperty(pi);
当我对所有属性执行此操作时,效果很好。
希望有一天这对其他人有帮助!
关于android - Ksoap2 Android - 如何为复杂对象的子属性指定命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9587577/
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
我一直在玩一个脚本,它在Chrome中获取选定的文本并在Google中查找它,提供四个最佳选择,然后粘贴相关链接。它以不同的格式粘贴,具体取决于当前在Chrome中打开的页面-DokuWiki打开的DokuWiki格式,普通网站的HTML,我想要我的WordPress所见即所得编辑器的富文本。我尝试使用pbpaste-Preferrtf来查看没有其他样式的富文本链接在粘贴板上的样子,但它仍然输出纯文本。在文本编辑中保存文件并进行试验后,我想出了以下内容text=%q|{\rtf1{\field{\*\fldinst{HYPERLINK"URL"}}{\fldrsltTEXT}}}|te
我在尝试使用Nokogiri构建XML文档时遇到了一个小问题。我想将我的元素之一称为“文本”(请参阅下面粘贴代码的最底部)。通常,要创建一个新元素,我会执行类似以下的操作xml.text--但它似乎是.text是Nokogiri已经用来做其他事情的方法。因此,当我写这行时xml.textNokogiri没有创建名为的新元素但只是写了意味着成为元素内容的文本。我怎样才能让Nokogiri实际制作一个名为的元素??builder=Nokogiri::XML::Builder.newdo|xml|xml.TEI("xmlns"=>"http://www.tei-c.org/ns/1.0"
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'