2016-11-03 1 views
0

Прежде всего, я хотел бы сказать, что у меня есть та же проблема, что и следующий вопрос: 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] & пароля = тест & роли = админ

+1

Не вопрос node.js. Неверный тег –

+0

Не могли бы вы уточнить ошибку? Не могли бы вы также проверить запрос с Чарльзом и опубликовать его здесь? – fiks

+0

Извините, Abhyudit, API создан в Node.js, поэтому я думал, что должен добавить его там. – user2145124

ответ

0

Из того, что я вижу в запросе почтальона, вы отправляете х-WWW-форм-urlencoded запроса.

Вы должны указать его в коде. См. Пример: POST request using application/x-www-form-urlencoded

Относительно Чарльза: поскольку вы используете https, вам необходимо включить прокси-сервер для хоста. Больше информации здесь: https://www.charlesproxy.com/documentation/proxying/ssl-proxying/

Смежные вопросы