#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. Где подробный метод? Я не могу найти его на их сайте.