我使用Spring RESTful
应用程序并尝试执行POST
请求。它发布数据,但是,当我尝试GET
将其返回时,数据格式似乎格式不正确。下面提供了该方法,
@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);
}
}
POST
中的Curl
请求,curl -H "Content-Type: application/json" -X POST -d '{"name":"mikiii"}' http://localhost:8080/rest/generateAddress
我使用
GET
获取数据,[
// more data
{
"id": 16,
"name": "{\"name\":\"mikiii\"}",
"address": "mvmHyU1k6qkoUEpM9CQg4kKTzQ5si3oR1e"
}
]
如果我仅使用
String
,curl -H "Content-Type: application/json" -X POST -d '"muuul"' http://localhost:8080/rest/generateAddress
我把它拿回来
[
// .........,
{
"id": 17,
"name": "\"muuul\"",
"address": "mr9ww7vCUzvXFJ6LDAz6YHnHPsd9kgYfox"
}
]
这是
generateAddress
方法的内部实现(I have the same name, should have changed)
创建一个新的WalletInfo
实体,当前返回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;
}
当前,
generateAddress
返回void
。之前,我尝试从方法中返回WalletInfo
并使用代码设置位置,httpHeaders.setLocation(uriComponentsBuilder.path("/wallets/{id}").buildAndExpand(walletInfo.getId()).toUri());
我收到一个错误,这似乎不起作用。如果需要,我可以提供该错误堆栈,但是,现在我再次从当前代码中的方法返回
void
。在
RESTful
方法级别,我尝试使用@PathVariable("name") String walletName
和String walletName
。显然,这没有帮助并提供了错误。
UPDATE
下面提供了带有
GET
请求的Curl
方法处理程序,// 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);
}
如何获得像
String
这样的干净"name": "testuser"
中的地址并具有正确的POST
请求? 最佳答案
当前,您将WalletInfo作为响应实体getWalletById()返回。
return new ResponseEntity<WalletInfo>(walletInfo, HttpStatus.OK);
因此,此WalletInfo将由jackson mapper转换,并且WalletInfo中的相应字段将作为json对象返回。我猜您在WalletInfo类中具有ID,名称和地址字段。
如果您只想返回这些字段的子集,例如,name和address,则创建一个包装类,例如
public class WalletInfoWrapper {
String name;
String address;
.. //gettter , setter
}
并从您的处理程序中返回此类的对象,因此您的get方法处理程序的新代码将如下所示:
@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);
}
如果只需要地址,那么包装器只能有一个地址字段。
另外,如果您对每个双引号之前的“ \”感到不安,那是因为您要将输出从rest调用重定向到json实用程序
curl -G http://localhost:8080/rest/wallets/1 | json
,您可以通过
curl -G http://localhost:8080/rest/wallets/1