2017-08-16 14 views
0

Java/ Sprig MVC RESTful appで動作し、クライアントがそれを消費します。私は同じ入力パラメータと異なる戻り値の型に2 RESTfulのメソッドを持っています。方法は、以下のクライアント側で同じパラメータと異なる戻り値の型を持つSpring RESTful GETメソッド

// this method should return the `String` 
@RequestMapping(value = "wallets/{currencyName}/{walletName}", method = RequestMethod.GET 
      , produces = "text/html") 
    public ResponseEntity<String> getAddressWithCurrencyAndWalletName(@PathVariable("currencyName") String currencyName, 
                     @PathVariable("walletName") String walletName) { 

     logger.info("The currency name is {} and wallet name is {}", currencyName, walletName); 
     WalletInfo walletInfo = walletService.getWalletInfoWithCurrencyAndWalletName(currencyName, walletName); 

     if (Objects.isNull(walletInfo)) { 
      return new ResponseEntity<String>(HttpStatus.NOT_FOUND); 
     } 

     String address = walletInfo.getAddress(); 
     return new ResponseEntity<String>(address, HttpStatus.OK); 
    } 


    // this method should return the `Long` 
    @RequestMapping(value = "wallets/{currencyName}/{walletName}", method = RequestMethod.GET, 
      produces = "text/html") 
    public ResponseEntity<Long> getWalletIdWithCurrencyAndWalletName(@PathVariable("currencyName") String currencyName, 
                    @PathVariable("walletName") String walletName) { 

     logger.info("The currency name is {} and wallet name is {}", currencyName, walletName); 
     WalletInfo walletInfo = walletService.getWalletInfoWithCurrencyAndWalletName(currencyName, walletName); 

     if (Objects.isNull(walletInfo)) { 
      return new ResponseEntity<Long>(HttpStatus.NOT_FOUND); 
     } 

     Long walletId = walletInfo.getId(); 
     return new ResponseEntity<Long>(walletId, HttpStatus.OK); 
    } 

を提供しているBalanceボタンがクリックされた場合、私はこのようなUI、

enter image description here

を持って、私は新しいページを開きたいですURLhttp://localhost:63342/WalletClient/balance.html?walletId=someValueであり、私は非常に目的のために2番目のRESTfulメソッドを使いたいと思います。私はクライアントコードが似ていると思います。

$(document).ready(function() { 

    var walletName, selectedCurrency; 

    // generic request function with the URL, method name and 
    // the request (GET, POST, PUT, DELETE etc) data 
    function request(url, method, data) { 
     $.ajax({ 
      url: baseUrl + url, 
      // url: url, 
      method: method, 
      data: data 
     }) 
    } 

    // some code 
    // we have the walletName and selectedCurrency values extracted 

    $("#balance").click(function() { 

      console.log("Open the balance page"); 

      var url = "/rest/wallets/?" + "currencyName=" + selectedCurrency + "&" + "walletName=" + walletName; 

      // get the wallet Id from the cureny name and the wallet name 
      request(url, "GET").done(function (data) { 
       window.open("/WalletClient/balance.html?walletId=" + data); 
      }); 
     }); 
} 

URLRESTful方法から来ていると私はそれがLongを返すことを期待しています。このシナリオではほとんど質問がありません。

a。同じGET要求がStringLongを返す可能性があるため、同じように動作しますか?

b。 dataは既にStringまたはLongですか、それ以上のことをする必要がありますか?

わかりやすく、window.open("/WalletClient/balance.html?" + "currencyName=" + selectedCurrency + "&" + "walletName=" + walletName);のように書くことができます。 しかし、この場合、currencyNamewalletNameはユーザーに公開されますので、URLで非表示にすることをお勧めします。

UPDATE

私は、クライアント側URLは次のようになりますLongString

/** 
    * get the wallet address with the currency name and the wallet name 
    * 
    * returns the Long value for the walletInfo 
    * curl -i -H "Accept: text/html" http://localhost:8080/rest/wallets/bitcoin/puut | json 
    * 
    * 
    * returns the String value for the walletInfo address 
    * curl -i -H "Accept: text/html" http://localhost:8080/rest/wallets/bitcoin/puut/true | json 
    * 
    * @param currencyName 
    * @param walletName 
    * @return 
    */ 
    @RequestMapping(value = "wallets/{currencyName}/{walletName}", method = RequestMethod.GET 
      , produces = "text/html") 
    public ResponseEntity<?> getAddressWithCurrencyAndWalletName(@PathVariable("currencyName") String currencyName, 
                   @PathVariable("walletName") String walletName 
      , @RequestParam(value = "address", required = false) boolean address) { 

     logger.info("The currency name is {} and wallet name is {}", currencyName, walletName); 
     WalletInfo walletInfo = walletService.getWalletInfoWithCurrencyAndWalletName(currencyName, walletName); 

     if (Objects.isNull(walletInfo)) { 
      return new ResponseEntity<String>(HttpStatus.NOT_FOUND); 
     } 

     // address values is expected 
     if(address){ 

      String addressValue = walletInfo.getAddress(); 
      return new ResponseEntity<String>(addressValue, HttpStatus.OK); 
     } 

     else { 
      Long walletId = walletInfo.getId(); 
      return new ResponseEntity<Long>(walletId, HttpStatus.OK); 
     } 
    } 

間、

var url = "/rest/wallets/?" + "currencyName=" + selectedCurrency + "&" + "walletName=" + walletName; 

がされている特定のオプションのパラメータをaccomodateanするためのコードを変更これは今正しい?

答えて

1

メソッドを変更してResponseEntity<?>タイプを返すことができます。

@RequestMapping(...) 
public ResponseEntity<?> yourMethod(...) { 
    // business-logic 
    if (some condition) { 
     return new ResponseEntity<String>(address, HttpStatus.OK); 
    } else if (...) { 
     return new ResponseEntity<Long>(walletId, HttpStatus.OK); 
    } 
} 
+0

いい考えです。どうすれば 'boolean true'を出さないか、' String'を返すのでなければ 'Long'を返します。 – Arefe

+1

はい、戻り値の型を選択するか、LongとStringの両方の値(単純なDTOオブジェクトを使用する場合)を返すための追加のパラメータを追加できます。 – Shchipunov

+0

質問が更新され、コードが提供されました。あなたは一見をしていただけますか? – Arefe

関連する問題