2

Please help me make the same on Swift 3

curl -X POST -d MD='44586989' -d TermUrl='https://proil.moscow/' --data-urlencode 'PaReq=+/eyJNZXJjaGFudE5hbWUiOm51bGwsIkZpcnN0U2l4IjoiNDI3NjM4IiwiTGFzdEZvdXIiOiIxMTQ1IiwiQW1vdW50IjoxMDM0LjAwLCJDdXJyZW5jeUNvZGUiOiJSVUIiLCJEYXRlIjoiMjAxOC0wMy0yNlQwMDowMDowMCswMzowMCIsIkN1c3RvbWVyTmFtZSI6bnVsbCwiQ3VsdHVyZU5hbWUiOiJydS1SVSJ9' https://demo.cloudpayments.ru/acs

I try this:

 var request = URLRequest(url: URL(string: acsUrlString)!)
    request.httpMethod = "POST"
    let session = URLSession.shared


    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    let d = String("PaReq=" + pareq + "&MD=" + String(Int(transactionId)) +  "&TermUrl=https://proil.moscow").data(using:String.Encoding.ascii, allowLossyConversion: false)
    request.httpBody = d

where d without encoding = PaReq=+/eyJNZXJjaGFudE5hbWUiOm51bGwsIkZpcnN0U2l4IjoiNDI3NjM4IiwiTGFzdEZvdXIiOiIxMTQ1IiwiQW1vdW50IjoxMDM0LjAwLCJDdXJyZW5jeUNvZGUiOiJSVUIiLCJEYXRlIjoiMjAxOC0wMy0yNlQwMDowMDowMCswMzowMCIsIkN1c3RvbWVyTmFtZSI6bnVsbCwiQ3VsdHVyZU5hbWUiOiJydS1SVSJ9&MD=44586989&TermUrl=https://proil.moscow

So this code gives me the same result result as

curl -X POST -d MD='44586989' -d TermUrl='https://proil.moscow/' -d PaReq='+/eyJNZXJjaGFudE5hbWUiOm51bGwsIkZpcnN0U2l4IjoiNDI3NjM4IiwiTGFzdEZvdXIiOiIxMTQ1IiwiQW1vdW50IjoxMDM0LjAwLCJDdXJyZW5jeUNvZGUiOiJSVUIiLCJEYXRlIjoiMjAxOC0wMy0yNlQwMDowMDowMCswMzowMCIsIkN1c3RvbWVyTmFtZSI6bnVsbCwiQ3VsdHVyZU5hbWUiOiJydS1SVSJ9' https://demo.cloudpayments.ru/acs

I get this response from server cloudpayments: "Check '+' symbol in PaReq parameter.",

Mi Ka
  • 135
  • 1
  • 9
  • Please provide the community with any errors or problems you are facing, without them it is hard to guess where this is failing. – Stefan Crain Mar 26 '18 at 16:23
  • @StefanCrain I get this response from server cloudpayments: "Check '+' symbol in PaReq parameter.", – Mi Ka Mar 26 '18 at 16:27
  • 1
    You have to percent encode the values that you add to the body of your POST request. E.g. https://stackoverflow.com/a/49469256/1271826. Notably, `+` characters can be problematic because most web services replace them with space characters per the `x-www-form-urlencoded` spec. – Rob Mar 26 '18 at 17:04
  • @MiKa What do you use UIWebView and WKWebView? – Vitaly Potlov Aug 23 '18 at 05:31

1 Answers1

2

Thank you, Rob, that answers helped me.

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.httpBody = postParameters.map { key, value in
   let keyString = key.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)!
   let valueString = (value as! String).addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)!
   return keyString + "=" + valueString
}.joined(separator: "&").data(using: .utf8)

and extension

extension CharacterSet {

static var urlQueryValueAllowed: CharacterSet = {
    let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
    let subDelimitersToEncode = "!$&'()*+,;="

    var allowed = CharacterSet.urlQueryAllowed
    allowed.remove(charactersIn: generalDelimitersToEncode + subDelimitersToEncode)

    return allowed
}()
}
Mi Ka
  • 135
  • 1
  • 9