2016-11-03 9 views
0

まず、私は次の質問と全く同じ問題があると言いたいと思います。How to add data to HTTPBody with PUT method in NSURLSession?。しかしそれは答えられなかったので、私は自分自身の質問をしました。PUTメソッドを使用したHTTPBodyのデータは失敗しますが、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

明確にすることから、入力した後

編集は、私が午前問題は、私はsaveUser方法で行うように私は「postString」editUser方法で同じように埋めることである。(少なくともI私はそうだと思う) しかし、saveUserメソッドでは、postStringはAPIに正しく渡されているようです(指定された値を持つ新しいユーザーを作成します)。 editUserメソッドは値を渡しません。

サーバーにコンソールログを記録すると、すべての値が「未定義」であることが示されます。 postStringがiOSの部分で正しいかどうかをテストするには、両方の文字列を出力しました。どちらも私は郵便配達の要求に何を参照してください、あなたはx-www-form-urlencodedでリクエストを送信していることから&パスワード=テスト&役割=管理者

+1

node.jsの質問ではありません。間違ったタグ –

+0

あなたはより具体的にエラーになりますか?チャールズとのリクエストを確認して、ここに投稿してください。 – fiks

+0

申し訳ありませんが、APIはNode.jsで作成されているので、そこに追加する必要があります。 – user2145124

答えて

関連する問題