首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有符号值的IOS Swift Soap消息

具有符号值的IOS Swift Soap消息
EN

Stack Overflow用户
提问于 2015-06-04 19:46:23
回答 1查看 700关注 0票数 0

我有以下代码从我的IOS Swift应用程序调用web服务。(当按下页面上的按钮时,代码将被执行。)

挑战在于数小时的价值。当变送符在值中时,我得到一个http错误代码400。当我取出符号时,对web服务的调用就会正常工作。我尝试过各种方法来对值以及整个soap消息进行编码,但这些方法都没有起作用。我尝试了%26和@26;作为符号的替代,当web服务调用将数据插入数据库时,服务器上的%26或%26;被插入到数据库中而不是符号。我还尝试在整个SOAP消息上使用stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding),以及仅使用时数值,但都失败了。知道该如何处理这个符号吗?这样就可以将其作为SOAP消息的一部分发送,并在服务器上接收到它时自动返回给一个符号?

代码语言:javascript
复制
//
//  ViewController.swift
//  TestWebServiceSoap
//
//  Created by George M. Ceaser Jr on 6/2/15.
//  Copyright (c) 2015 George M. Ceaser Jr. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

var is_SoapMessage: String = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:cgs=\"http://www.cgsapi.com/\"><soapenv:Header/><soapenv:Body><cgs:Add><cgs:Language_Code>EN</cgs:Language_Code><cgs:Country_Code>USA</cgs:Country_Code><cgs:State_Province_Code>USA-DC</cgs:State_Province_Code><cgs:City_ID>1</cgs:City_ID><cgs:Location_ID>14</cgs:Location_ID><cgs:Name>Green Lantern / Tool Shed</cgs:Name><cgs:Additional_Info>null</cgs:Additional_Info><cgs:Hours>{hours}</cgs:Hours><cgs:Address_Line1>1335 Green Court NW</cgs:Address_Line1><cgs:Address_Line2>In alley behind building at 1335 L Street NW</cgs:Address_Line2><cgs:Postal_Code>20005</cgs:Postal_Code><cgs:Phone>202.347.4533</cgs:Phone><cgs:Email_Address>null</cgs:Email_Address><cgs:Contact_Email_Address>null</cgs:Contact_Email_Address><cgs:WebSite>http://www.greenlanterndc.com</cgs:WebSite><cgs:Open_Status>true</cgs:Open_Status><cgs:Attribute_Code_List>B,G,LL</cgs:Attribute_Code_List><cgs:Submitter_Email>null</cgs:Submitter_Email><cgs:Latitude>38.90447617</cgs:Latitude><cgs:Longitude>38.90447617</cgs:Longitude><cgs:Other_Change>null</cgs:Other_Change><cgs:NewCityLatitude>0.0</cgs:NewCityLatitude><cgs:NewCityLongitude>0.0</cgs:NewCityLongitude><cgs:NewCityName>null</cgs:NewCityName></cgs:Add></soapenv:Body></soapenv:Envelope>"

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func btnClicked(sender: AnyObject)
{
    var is_URL: String = "http://www.cgsapi.com/CGSWebService.asmx"

    var lobj_Request = NSMutableURLRequest(URL: NSURL(string: is_URL)!)
    var session = NSURLSession.sharedSession()
    var err: NSError?

    var ls_Hours: String = "16-2 Fri & Sat-3 Sun 13-2"

    is_SoapMessage =  is_SoapMessage.stringByReplacingOccurrencesOfString("{hours}", withString: ls_Hours, options: NSStringCompareOptions.LiteralSearch, range: nil)

    lobj_Request.HTTPMethod = "POST"
    lobj_Request.HTTPBody = is_SoapMessage.dataUsingEncoding(NSUTF8StringEncoding)
    lobj_Request.addValue("www.cgsapi.com", forHTTPHeaderField: "Host")
    lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
    lobj_Request.addValue(String(count(is_SoapMessage)), forHTTPHeaderField: "Content-Length")
    //lobj_Request.addValue("223", forHTTPHeaderField: "Content-Length")
    lobj_Request.addValue("http://www.cgsapi.com/Add", forHTTPHeaderField: "SOAPAction")

    var task = session.dataTaskWithRequest(lobj_Request, completionHandler: {data, response, error -> Void in
        println("Response: \(response)")
        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("Body: \(strData)")

        if error != nil
        {
            println("Error: " + error.description)
        }

    })
    task.resume()
}

}

有人对此有什么想法吗?如果不是的话,我将不得不和苹果谈谈,因为我确信我只是错过了一些简单的东西。)如能提供任何帮助,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-20 15:27:16

因此,经过一番挖掘,我终于找到了一个合适的答案。XML / SOAP显然支持指示值可以包含特殊字符的能力。您可以通过将CDATA元素中的值括起来来做到这一点。例如,如果我有一个名为字符的XML节点的值,该节点的值应该是George & Gracie,那么我应该将其编码如下:

代码语言:javascript
复制
<Characters>
  <![CDATA[George & Gracie]]>
</Characters>

这对我有效,不需要在服务器端进行特殊编码来处理来自IOS的请求。

顺便说一句--看来Visual中的Windows开发会自动处理这个问题,因为我不需要显式地在应用程序中添加CDATA元素。希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30652822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档