2012-05-23 49 views
2

因为RubyMotion在编译时似乎做了很多类型转换,所以我无法将正确的数据类型传递到NSMutableURLRequest POST请求中。它期待着NSData,但我无法弄清楚如何在不抛出错误的情况下为NSData键入一个NSString变量。如果没有类型转换,我们的SOAP服务器无法正确接收数据,并且我得到可怕(模糊)的“根级数据无效,行1,位置1”错误。RubyMotion >>如何将变量作为特定类型投射?

这是问题的行:

postXML = "<xml><whatever>hey</whatever></xml>" 
postData = (postXML as NSData).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true); 

request = NSMutableURLRequest.alloc.init 
request.setURL(NSURL.URLWithString("https://services.sbx1.cdops.net/v4.3/SubscriberServicePox.svc/Login")) 
request.setHTTPMethod("POST") 

request.setValue("application/xml", forHTTPHeaderField: "Content-Type") 
request.setHTTPBody(postData, dataUsingEncoding:NSUTF8StringEncoding) 

theConnection = NSURLConnection.alloc.initWithRequest(request, delegate:self) 

任何帮助,将不胜感激。

+0

'(postXML as NSData)'应该只是末尾没有分号的'postXML',否则你的代码不会为我抛出任何错误,如果我检查'request.HTTPBody',它是' NSConcreteMutableData'对象,而不是'NSString'。你的代码的哪个特定部分抛出错误? –

+0

就显式类型转换而言,RubyMotion似乎为您处理所有这些。 上调用一个NSString一个NSData的方法有效地类型中,它适当地: 之前 loginPostXML =(loginPostXML作为NSData的).dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion:真); 后 loginPostXML = loginPostXML.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion:true) 一个简单的解决方案,但类型模糊仍然存在(不幸)。 – cnp

+0

'dataUsingEncoding'是将NSString转换为NSData的标准方法。你是说只是使用'loginPostXML.dataUsingEncoding ...'为你解决吗?如果是这样,我可以添加它作为正式答案。 –

回答

2

你对发生的事情的理解有一些漏洞,所以让我们来分解它。

postXML = "<xml><whatever>hey</whatever></xml>" 
postData = (postXML as NSData).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true); 

我不知道你在哪里得到了(postXML as NSData)但它是无效的,是没有意义的。 dataUsingEncoding:allowLossyConversion:是在NSString而非NSData上声明的Objective-C方法。调用它的正确的方法是这样的

postData = postXML.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 

红宝石运动不会为你做type conversions,林心如不和Objective-C没有。如果你发送消息给一个不响应你发送消息的类的实例,你将会崩溃/引发一个异常。

当你调用

postXML.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 

你是不是做类型转换,您要发送的消息dataUsingEncoding:allowLossyConversion:NSString一个实例。这将导致返回一个新的全新对象(实例NSData)。

+0

我应该更清楚; (var as Type)是一种在其他语言中使用的惯例,我希望能更好地说明演员的问题,但是,你的解释是有道理的 - 非常感谢。 – cnp

相关问题