API Pastebin не работает с запросами Swift 4

#swift #pastebin

#swift #pastebin

Вопрос:

Я пишу некоторый код для доступа к API Pastebin и продолжаю сталкиваться с этой проблемой:

 Bad API request, use POST request, not GET
 

Я перепробовал целую кучу вещей и не могу заставить его работать. Когда я использую cURL , все работает нормально, но в моем приложении Swift вызов завершается с ошибкой.

     func postPasteRequest(urlEscapedContent: String, callback: @escaping (String) -> ()) {
        var request = URLRequest(url: URL(string: "http://pastebin.com/api/api_post.php")!)
        request.httpMethod = "POST"
        let postString = "api_paste_code=(urlEscapedContent)amp;api_dev_key=(API_KEY)amp;api_option=pasteamp;api_paste_private=1amp;api_paste_expire_date=N"
        request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil
                // check for fundamental networking error
                else {
                    NSLog("error=(String(describing: error))")
                    return
            }
            
            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
                NSLog("statusCode should be 200, but is (httpStatus.statusCode)")
                NSLog("response = (String(describing: response))")
            }
            
            let responseString = String(data: data, encoding: .utf8)
...
    }
task.resume()
}
 

Комментарии:

1. Какой cURL рабочий код?

2. curl --location --request POST 'https://pastebin.com/api/api_post.php' --data-raw 'api_paste_code=test123amp;api_dev_key=my_keyamp;api_option=pasteamp;api_paste_private=1amp;api_paste_expire_date=N'

3. https против http ?

4. Нет, уже использует https.

5. Это единственное различие, которое я заметил между Swift (который имеет http ) и кодом curl (который использует https ). Перенаправление должно быть управляемым. Таким образом, ошибка кажется вводящей в заблуждение.

Ответ №1:

Добавьте task.resume() после закрывающих фигурных скобок метод dataTask. кстати, у pastebin есть довольно подробный метод в Swift о том, как получить данные.

здесь вы можете найти вызов этого API в swift.

 // Vladimir Zhelnov - neatek.pw - Web/iOS dev
class Class_JSONRequest {    
    func get_url_post(get_url: String, params: String, completion: @escaping (_ result: NSDictionary) -> Void) {
        let myUrl = URL(string: get_url);
        var request = URLRequest(url:myUrl!)
        request.httpMethod = "POST"
        let postString = params;
        request.httpBody = postString.data(using: String.Encoding.utf8);
        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
            if error != nil
            {
                print("error=(error)")
                return
            }
            do {
                if(data != nil) {
                    let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                    if let parseJSON = json {
                        //print(parseJSON)
                        completion(parseJSON)
                    }
                }
            } catch {
                print(error)
            }
        }
        task.resume()
    }
}
/* usage:
let post_params = "some=postamp;params=1";
JSON.get_url_post(get_url: "http://..api", params: post_params , completion: { answer in
    ... something
});
*/
 

Комментарии:

1. Извините, я должен был включить его. У меня уже есть .taskResume() вызов

2. Где подробный метод? Я не могу найти его на их сайте.