Прежде всего, я хотел бы сказать, что у меня есть та же проблема, что и следующий вопрос: How to add data to HTTPBody with PUT method in NSURLSession?. Но на него не ответили, поэтому я задал свой вопрос.Данные в HTTPBody с использованием метода PUT не работают, тогда как он работает с POST?
Мы написали API-интерфейс узла для школьного задания. Мы протестировали весь API. (Шансы быть чем-то не так там тонкие.)
После этого я стал работать с клиентом iOS для пользователей CRUD. Создание пользователя идет отлично, но всякий раз, когда я пытаюсь редактировать пользователя, происходит что-то странное. Данные на сервере поступают как неопределенные.
Я использую следующий код для сохранения пользователя:
func saveUser(user: User, completionHandler: (String?, User?) -> Void) {
let url = NSURL(string: "https://pokeapi9001.herokuapp.com/api/users/")
let request = NSMutableURLRequest(URL:url!)
request.HTTPMethod = "POST"
let postString = "email=\(user.email)&password=\(user.password!)&role=\(user.role)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error: \(error)")
}
do {
guard let data = data else {
throw JSONError.NoData
}
guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
throw JSONError.ConversionFailed
}
//do specific things
} catch let error as JSONError {
completionHandler(error.rawValue, nil)
} catch let error as NSError {
completionHandler(error.debugDescription, nil)
}
}
task.resume()
}
иметь в виду, это прекрасно работает (не знаю, если она предназначена для использования, как это)
Для редактирования пользователь я использую следующий код:
func editUser(user: User, completionHandler: (String?, User?) -> Void) {
let url = NSURL(string: "https://pokeapi9001.herokuapp.com/api/users/\(user.id!)")
let request = NSMutableURLRequest(URL:url!)
request.HTTPMethod = "PUT"
let postString = "email=\(user.email)&password=\(user.password!)&role=\(user.role)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error: \(error)")
}
do {
guard let data = data else {
throw JSONError.NoData
}
guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
throw JSONError.ConversionFailed
}
//do specific things
} catch let error as JSONError {
completionHandler(error.rawValue, nil)
} catch let error as NSError {
completionHandler(error.debugDescription, nil)
}
}
task.resume()
}
(Исходный код является немного больше, но я удален частями, которые не имели ничего общего с фактическим размещением данных)
Я действительно не знаю, что я делаю неправильно, может быть что-то маленькое и глупое. Пожалуйста помоги.
редактировать после ввода от @fiks
Чтобы было ясно, что проблема я имею что я заполнить «postString» так же, как в методе editUser как я в методе saveUser. (По крайней мере, думаю, что я делаю) Однако в методе saveUser postString, кажется, правильно передается API (он создает нового пользователя с заданными значениями). Метод editUser не передает значения через.
Если я помещаю консольный журнал на сервер, он отображает все значения «undefined». Чтобы проверить правильность postString в iOS-части, я напечатал обе строки. Оба из них выводятся [email protected] & пароля = тест & роли = админ
Не вопрос node.js. Неверный тег –
Не могли бы вы уточнить ошибку? Не могли бы вы также проверить запрос с Чарльзом и опубликовать его здесь? – fiks
Извините, Abhyudit, API создан в Node.js, поэтому я думал, что должен добавить его там. – user2145124