0

I work with a Spring RESTful app and tries to do a POST request. It posts the data, but, when I tried to GET it back, the data format seems not in the correct format. The method is provided below,

@RestController @RequestMapping("/rest") @Produces({"text/plain", "application/xml", "application/json"}) public class WalletRestController { @Autowired private WalletService walletService; @PostMapping("/generateAddress") public ResponseEntity<Void> generateAddress(@RequestBody String walletName, UriComponentsBuilder uriComponentsBuilder) { System.out.println("Creating wallet with name = " + walletName); if (walletName == null) { return new ResponseEntity<Void>(HttpStatus.NOT_ACCEPTABLE); } walletService.generateAddress(walletName); HttpHeaders httpHeaders = new HttpHeaders(); // httpHeaders.setLocation(uriComponentsBuilder.path("/wallets/{id}").buildAndExpand(walletInfo.getId()).toUri()); return new ResponseEntity<Void>(httpHeaders, HttpStatus.CREATED); } } 

The POST request in Curl,

curl -H "Content-Type: application/json" -X POST -d '{"name":"mikiii"}' http://localhost:8080/rest/generateAddress 

I get the data using the GET,

[ // more data { "id": 16, "name": "{\"name\":\"mikiii\"}", "address": "mvmHyU1k6qkoUEpM9CQg4kKTzQ5si3oR1e" } ] 

If I use only a String,

curl -H "Content-Type: application/json" -X POST -d '"muuul"' http://localhost:8080/rest/generateAddress 

I get it back as

[ // ........., { "id": 17, "name": "\"muuul\"", "address": "mr9ww7vCUzvXFJ6LDAz6YHnHPsd9kgYfox" } ] 

This is the inner implementation of the generateAddress method (I have the same name, should have changed) create a new WalletInfo entity and currently returns void,

 @Override public synchronized void generateAddress(final String walletName) { WalletInfo walletInfo = walletInfoDao.getByName(walletName); // generate wallet, if the wallet is not // generated previously if (walletInfo == null) { if (genWalletMap.get(walletName) == null) { final WalletManager walletManager = WalletManager.setupWallet(walletName); walletManager.addWalletSetupCompletedListener((wallet) -> { Address address = wallet.currentReceiveAddress(); WalletInfo newWallet = createWalletInfo(walletName, address.toString()); walletMangersMap.put(newWallet.getId(), walletManager); genWalletMap.remove(walletName); }); genWalletMap.put(walletName, walletManager); // return walletInfo; } } // return null; } 

Currently, the generateAddress returns void. Earlier, I tried to return the WalletInfo from the method and set the location using the code, httpHeaders.setLocation(uriComponentsBuilder.path("/wallets/{id}").buildAndExpand(walletInfo.getId()).toUri());

I get an error and this seems not working. I can provide that error stack if necessary, but, now again I return the void from the method in the current code.

In the RESTful method level, I have tried with @PathVariable("name") String walletName and String walletName. Obvously, this didn't help out and provided errors.

UPDATE

The GET method handlers with the Curl request are provided below,

// curl -G http://localhost:8080/rest/wallets | json @RequestMapping(value = "/wallets", method = RequestMethod.GET) public ResponseEntity<List<WalletInfo>> getAllWalletInfo() { List<WalletInfo> walletInfos = walletService.getAllWallets(); if (Objects.isNull(walletInfos)) { return new ResponseEntity<List<WalletInfo>>(HttpStatus.NO_CONTENT); } return new ResponseEntity<List<WalletInfo>>(walletInfos, HttpStatus.OK); 

}

// curl -G http://localhost:8080/rest/wallets/1 | json @RequestMapping(value = "/wallets/{id}", method = RequestMethod.GET) public ResponseEntity<WalletInfo> getWalletById(@PathVariable("id") long id) { System.out.println("Get wallet info with Id = " + id); WalletInfo walletInfo = walletService.getWalletInfo(id); if (walletInfo == null) { return new ResponseEntity<WalletInfo>(HttpStatus.NOT_FOUND); } return new ResponseEntity<WalletInfo>(walletInfo, HttpStatus.OK); } 

How to get the address in the clean String like "name": "testuser" and have a proper POST request?

2
  • 1
    post your get method handler and how are you sending get request by curl Commented Aug 2, 2017 at 9:16
  • I have provided the get handlers with the cURL requests. Cna provided more info if required Commented Aug 2, 2017 at 9:27

1 Answer 1

1

Currently you are returning WalletInfo as a response entity getWalletById ().

return new ResponseEntity<WalletInfo>(walletInfo, HttpStatus.OK); 

So this WalletInfo will be converted by jackson mapper and the corresponding fields in WalletInfo will be returned as a json object. I am guessing you have id, name and address fields in you WalletInfo class. If you only want to return a subset of these fields like , name and address, then create a wrapper class like

public class WalletInfoWrapper { String name; String address; .. //gettter , setter } 

And return the object of this class from your handler , so your new code of get method handler will look like

@RequestMapping(value = "/wallets/{id}", method = RequestMethod.GET) public ResponseEntity<WalletInfoWrapper > getWalletById(@PathVariable("id") long id) { System.out.println("Get wallet info with Id = " + id); WalletInfo walletInfo = walletService.getWalletInfo(id); if (walletInfo == null) { return new ResponseEntity<WalletInfo>(HttpStatus.NOT_FOUND); } WalletInfoWrapper walletInfoWrapper = new WalletInfoWrapper (); walletInfoWrapper.setName(walletInfo.getName()); walletInfoWrapper.setAddress(walletInfo.getAddress()); return new ResponseEntity<WalletInfoWrapper >(walletInfoWrapper , HttpStatus.OK); } 

If you just want the address then your wrapper can have only address field. Plus if you are bothered about the "\" before each double quotes, that is because you are redirecting the output from the rest call to a json utility

curl -G http://localhost:8080/rest/wallets/1 | json 

, You can see the plain output by just

curl -G http://localhost:8080/rest/wallets/1 
Sign up to request clarification or add additional context in comments.

1 Comment

Works if I make the request like curl -H "Content-Type: application/json" -X POST -d "nonald" http://localhost:8080/rest/generateAddress.It returns the clear String

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.