Search code examples
swiftxmlpostnsurlsessionhmac

pho.to API Request Failing in Swift


Im currently trying to work with the pho.to API in my iOS application. I am experimenting with making simple requests according to the documentation, however I cannot seem to get the request to go through successfully. Inside my API client file, I have this code:

let dataStr = """
            <image_process_call>
                <image_url>http://developers.pho.to/img/girl.jpg</image_url>
                <methods_list>
                    <method order="1">
                        <name>desaturation</name>
                    </method>
                    <method order="2">
                        <name>caricature</name>
                        <params>type=1;crop_portrait=true</params>
                    </method>
                </methods_list>
                <thumb1_size>100</thumb1_size>
            </image_process_call>
            """

let encodedStr = dataStr.replacingOccurrences(of: "\n", with: "").replacingOccurrences(of: " ", with: "")

let signData = encodedStr.hmac(key: key)

let urlStr = "https://opeapi.ws.pho.to/addtask/?app_id=\(appId)&key=\(key)&sign_data=\(signData)&data=\(encodedStr.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!))"

The HMAC encoding is being done according to this Stack Overflow post. Unfortunately when making a request to this URL using URLSession I get this response:

<?xml version=\"1.0\"?>\n<image_process_response><status>SecurityError</status><err_code>614</err_code><description>Error in POST parameters: one or more parameters (DATA , SIGN_DATA or APP_ID) are empty</description></image_process_response>

I feel like my issue is more related to actually forming the request rather than something specific to the API itself. I know my code is a little messy, however I was hoping that somebody could point me in the right direction in terms of making a request like this. Thanks!


Solution

  • As per their documentation you can see that data sent over from POST requests are in body (In cURL calls -d specifies the body of the request)

    You are sending params/data in query, which the pho.to API doesn't accept, hence the error.

    Here's a sample on how you can do:

    let defaultSessionConfiguration = URLSessionConfiguration.default
    let defaultSession = URLSession(configuration: defaultSessionConfiguration)
    
    // Setup the request with URL
    let url = URL(string: "https://opeapi.ws.pho.to/addtask")!
    var urlRequest = URLRequest(url: url)
    
    // Convert POST string parameters to data using UTF8 Encoding
    let postData = yourXMLString.data(using: .utf8)
    
    // Set the httpMethod and assign httpBody
    urlRequest.httpMethod = "POST"
    urlRequest.httpBody = postData
    
    // Create dataTask
    let dataTask = defaultSession.dataTask(with: urlRequest) { (data, response, error) in
        // Handle your response here
    }
    
    // Fire the request
    dataTask.resume()