【问题标题】:How to send a request with alamofire with xml Body如何使用带有 xml Body 的 alamofire 发送请求
【发布时间】:2017-03-16 02:56:07
【问题描述】:

我在我的项目中安装了 Alamofire,现在这就是我所做的。

我安装了postman,并将我的 url 和 body 放入了一个 xml 对象,我得到了我的结果。

这是我对邮递员所做的具体操作的图片

我现在如何使用 Alamofire 或 SWXMLHash 发送它,因为我使用邮递员发送它

提前致谢!

编辑

我从另一个问题尝试过这个:

 Alamofire.request(.POST, "https://something.com" , parameters: Dictionary(), encoding: .Custom({
            (convertible, params) in
            let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest

            let data = (self.testString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
            mutableRequest.HTTPBody = data
            return (mutableRequest, nil)
        }))


    .responseJSON { response in


    print(response.response) 

    print(response.result)   


    }
}

但它没有发送任何东西

这是日志:

可选({ 网址: https://something.com } { 状态码:200,标题 { 连接=“保持活动”; “内容长度”= 349; “内容类型”=“应用程序/xml”; 日期 =“格林威治标准时间 2016 年 11 月 2 日星期三 21:13:32”; 服务器 = nginx; "Strict-Transport-Security" = "max-age=31536000; includeSubDomains"; } })

失败

编辑

永远不要忘记传递参数,如果你没有简单的添加这个,参数:Dictionary()

【问题讨论】:

  • 乍一看,您的代码看起来是有效的。我建议您将您的请求与邮递员的有效请求进行比较。也许服务器需要特殊的Content-Type 或其他东西。您应该找到请求之间的区别。回应可能不会给你答案。
  • 嗨@Silmaril 感谢您的评论。我在邮递员和我的项目中使用相同的网址,但在邮递员中,我得到了我应该得到的结果,但在我的应用程序中,我的问题出现了错误。我不明白你应该尝试什么内容类型
  • 相同的 url 是不够的。请求中还包含 HTTP 标头(其中之一是 Content-Type)。 Alamofire.request 方法返回您的应用程序正在执行的实际请求。你可以print它并与邮递员的请求数据进行比较(按右侧的code按钮,你也可以将类型更改为cURL,使其看起来类似于print结果)。
  • 我可能会在这里找到答案 stackoverflow.com/a/32631261/3704857 但我无法获得任何日志来查看我是否做得对你知道如何打印来自 nsurlconnection 的响应
  • 你的意思是像这样使用NSURLConnection 对你有用吗?您使用的 API 应该没有区别。差异在于您的实际要求。例如,在您链接的示例中,有 request.setValue... 行。它实际上改变了我正在谈论的 HTTP 标头。您可以使用 Alamofire 或其他任何方式更改它们。 NSURLConnectionCustom 编码中接受与 Alamofire 相同的请求。

标签: ios xml swift alamofire swxmlhash


【解决方案1】:

使用 Swift 3 和 Alamofire 4

    let stringParams : String = "<msg id=\"123123\" reqTime=\"123123\">" +
        "<params class=\"API\">" + 
        "<param name=\"param1\">123213</param>" + 
        "<param name=\"param2\">1232131</param>" +
        "</params>" +
    "</msg>"

    let url = URL(string:"<#URL#>")
    var xmlRequest = URLRequest(url: url!)
    xmlRequest.httpBody = stringParams.data(using: String.Encoding.utf8, allowLossyConversion: true)
    xmlRequest.httpMethod = "POST"
    xmlRequest.addValue("application/xml", forHTTPHeaderField: "Content-Type")


    Alamofire.request(xmlRequest)
            .responseData { (response) in
                let stringResponse: String = String(data: response.data!, encoding: String.Encoding.utf8) as String!
                debugPrint(stringResponse)
    }

【讨论】:

  • 嗨。和 .authenticate(user: "user", password: "password") ??
【解决方案2】:

使用 Swift 3 和 Alamofire 4,您可以创建自定义 ParameterEncoding。与任何其他 XML 编码主体一样,SOAP 消息可以使用此参数编码,如下例所示。其他 XML 正文编码也可以类似地创建(查看urlRequest.httpBody = ... 所在的行):

struct SOAPEncoding: ParameterEncoding {
    let service: String
    let action: String

    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
        var urlRequest = try urlRequest.asURLRequest()

        guard let parameters = parameters else { return urlRequest }

        if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
            urlRequest.setValue("text/xml", forHTTPHeaderField: "Content-Type")
        }

        if urlRequest.value(forHTTPHeaderField: "SOAPACTION") == nil {
            urlRequest.setValue("\(service)#\(action)", forHTTPHeaderField: "SOAPACTION")
        }

        let soapArguments = parameters.map({key, value in "<\(key)>\(value)</\(key)>"}).joined(separator: "")

        let soapMessage =
            "<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/' s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>" +
            "<s:Body>" +
            "<u:\(action) xmlns:u='\(service)'>" +
            soapArguments +
            "</u:\(action)>" +
            "</s:Body>" +
            "</s:Envelope>"

        urlRequest.httpBody = soapMessage.data(using: String.Encoding.utf8)

        return urlRequest
    }
}

然后像这样使用它:

Alamofire.request(url, method: .post, parameters: ["parameter" : "value"], encoding: SOAPEncoding(service: "service", action: "action"))

【讨论】:

  • 非常感谢,创建自定义编码是一个非常合适的解决方案!
【解决方案3】:

假设您的请求中缺少有效的 HTTP 标头,更新后的请求可能如下所示:

Alamofire.request(.POST, "https://something.com", parameters: Dictionary() , encoding: .Custom({
            (convertible, params) in
            let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest

            let data = (self.testString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
            mutableRequest.HTTPBody = data
            mutableRequest.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
            return (mutableRequest, nil)
        }))
    .responseJSON { response in
    print(response.response) 
    print(response.result)   
    }
}

所以,基本上你应该添加一行

mutableRequest.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")

更新
尝试相同,但使用responseDataresponseString 而不是responseJSON,因为您的回复可能不是JSON

【讨论】:

  • 尝试相同但使用responseDataresponseString而不是responseJSON,因为您的回复可能不是JSON
  • 是的,我的响应也是一个 xml,但我认为 responseJson 是获取响应的标准
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2020-09-18
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多