2017-09-11 11 views
0

私は正直なところ、私はこれを行う方法を知っていると思っていました。RESTクライアント経由でdropwizard(Jersey)リソースに引数を渡す、郵便番号など?

ここでは、ユーザーを作成するための私の基本的なリソースです。

@POST 
@Path("create") 
@Timed 
@UnitOfWork 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public long createUser(@PathParam("username") String username, 
         @PathParam("password") String password) 
{ 
    User userToCreate = new User(); 
    System.out.println("**********************************************"); 
    System.out.println(username + " " + password); 
    System.out.println("**********************************************"); 

    userToCreate.setUsername(username); 
    userToCreate.setPassword(password); 

    // Save to database. 
    return userDAO.create(userToCreate); 
} 

非常にシンプルな、のSystem.outラインはちょうど私のデバッグを支援するためにある、この作品とき、彼らは削除されます(はい、私はあまりにも、暗号化を追加します!)

をとにかく、それが判明します私がやっていることに関係なく、PostMan経由でデータを送信するときに、ユーザー名とパスワードの値は常にnullです...何が起こっているのか分かりません。

フィールド "username"と "password"を生のjson withidというリクエストの本文として送信します。

何か不足していますか?

+0

ようにそれを使用していますが、何らかの理由で、すべてが – MickeyThreeSheds

+0

申し訳ありません... nullの場合、問題を実現し、期待して、私のコメントを削除あなたはそれを見ないだろう:)。あなたはPathParamを使用していますが、本体でデータを送信しています(パスではありません) – Pace

答えて

1

これらのパラメータは、本文ではなくクエリ文字列で送信する必要があります。

POST http://localhost:8080/create?username=jsmith&password=foobar 

別のオプション:たとえば

あなたが本当に体にそれを送信したい場合は、データを保持するオブジェクトを作成します。

public class UserPass { 
    private String username; 
    private String password; 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getPassword() { 
     return password; 
    } 
} 

そして、このように見えるように、あなたのメソッドのシグネチャを変更します。

{ 
    "username": "jsmith", 
    "password": "foobar" 
} 

は、Content-Typeが「アプリケーション/に設定されていることを確認してください:

public long createUser(UserPass userPass) { 
    User userToCreate = new User(); 
    System.out.println("**********************************************"); 
    System.out.println(userPass.getUsername() + " " + userPass.getPassword()); 
    System.out.println("**********************************************"); 

    userToCreate.setUsername(userPass.getUsername()); 
    userToCreate.setPassword(userPass.getPassword()); 

    // Save to database. 
    return userDAO.create(userToCreate);  
} 

次にJSONでこのような何かを投稿json "をPOSTリクエストに追加します。

+0

技術的には、そのようなクエリーにそれらを入れるには、 'QueryParam'を使います。 'PathParam'はURIのパス部分として渡されるパラメータ用です(例:/ users/{username}/{password} – Pace

+0

そうです。しかし、あなたが言ったように、あなたのユーザー名とパスワードを暗号化する必要があります。 HTTPSを使用していない限り、(暗号化されていても)クエリ文字列の一部としてその種類のペイロードを送信することは決して良い考えではありません。アクセスログなどに表示されます。 https://stackoverflow.com/questions/323200/is-an-https-query-string-secureを参照してください。 – tom

1

@PathParamアノテーションを使用してリソース関数の入力を取得していますが、Bodyを使用してデータを送信しています。あなたはあなたがする必要がある

xyz.com/create/{username}/{password}

または

のようなパスパラメータとしてユーザ名とパスワードを送信するためにどちらかの必要

リクエストクラスを作成し、入力パラメータとして使用してリクエストの本文からデータを取得します。

@Getter 
@Setter 
public class RegisterRequest{ 
    private String username; 
    private String password; 
} 
私はそのセットを持っていない - -

そしてええ、私は申し訳ありません、と述べている必要があります

@YourAnnotations 
public long create(RegisterRequest request){ 
    //Your code for creating user. 
}