pho.to API 请求失败 Swift

pho.to API Request Failing in Swift

我目前正在尝试在我的 iOS 应用程序中使用 pho.to API。我正在尝试根据文档提出简单的请求,但我似乎无法成功完成请求。在我的 API 客户端文件中,我有以下代码:

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

正在根据 this Stack Overflow post 进行 HMAC 编码。不幸的是,当使用 URLSession 向 URL 发出请求时,我得到了这样的回复:

<?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>

我觉得我的问题更多地与实际形成请求有关,而不是特定于 API 本身的问题。我知道我的代码有点乱,但是我希望有人能在提出这样的请求方面为我指明正确的方向。谢谢!

根据他们的文档,您可以看到从 POST 请求发送过来的数据在正文中(在 cURL 调用中 -d 指定请求的正文)

您在查询中发送 params/data,pho.to API 不接受,因此出现错误。

以下是您可以如何操作的示例:

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()