2016-11-02 4 views
4

Я установил Alamofire в свой проект, и теперь вот что я сделал.Как отправить заявку с помощью alamofire с xml Body

Я установил postman, и я поместил свой url и внутри тела объект xml, и я получил свой результат.

Вот картина того, что я точно сделал с почтальоном

enter image description here

Как я могу теперь использовать Alamofire или SWXMLHash, чтобы отправить его, как я отправить его с почтальоном

Спасибо заранее!

EDIT

Я попытался это с другой вопрос:

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) 


    } 
} 

Но это не отправлял ничего

Это журнал:

Дополнительно ({URL: https://something.com} {код состояния: 200, заголовки { Connec = "keep-alive"; "Content-Length" = 349; "Content-Type" = "application/xml"; Дата = "ср, 02 ноя 2016 21:13:32 GMT"; Сервер = nginx; «Строгий транспорт-Безопасность» = «max-age = 31536000; includeSubDomains»; }})

FAILURE

EDIT

НИКОГДА НЕ ЗАБУДЬТЕ ПЕРЕДАТЬ параметры, если вы не просто добавь это, параметры: Словарь()

+0

С первого взгляда ваш код выглядит действительным. Я предлагаю вам сравнить ваш запрос с действительным от почтальона. Возможно, сервер ожидает специальный 'Content-Type' или что-то еще. Вы должны найти разницу между запросами. Ответ может не дать вам ответ. – Silmaril

+0

Привет @Silmaril спасибо за ваш комментарий. Я использую тот же url в почтальоне и в моем проекте, но в почтальоне я получаю результат, который должен получить, но в моем приложении у меня есть ошибка в моем вопросе. Я не понял вас, что мне следует попробовать с типом контента –

+0

Одного URL-адреса может быть недостаточно. Запрос также включает заголовки HTTP внутри (один из которых - «Content-Type»). 'Alamofire.request' метод возвращает фактический запрос, который делает ваше приложение. Вы можете «распечатать» его и сравнить с данными запроса от почтальона (нажмите кнопку «код» справа, вы также можете изменить тип на 'cURL', чтобы он выглядел так же, как результат' print'). – Silmaril

ответ

2

Предполагая, что вы пропали без вести действительные заголовки 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") 

Update:
Попробуйте то же самое, но использовать responseData или responseString вместо responseJSON, потому что это возможно, что ваш ответ не JSON

+0

нет, к сожалению, это не сработало ни –

+0

попробуйте один и тот же, но используйте 'responseData' или' responseString' вместо 'responseJSON', потому что возможно, что ваш ответ не' JSON' – Silmaril

+0

Да, это был мой ответ, также является xml, но Я думал, что responseJson является стандартным, чтобы получить ответ –

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")) 
2

Использование 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) 
    } 
+0

привет. и .authenticate (пользователь: «пользователь», пароль: «пароль»)? –

Смежные вопросы