最近用Spring Boot搭建了一些restful api,寫起來真的很爽。但是當用Postman測試一些POST請求的接口的時候卻遇到一些問題,上網沖浪查了一堆博客資料,發現都講得不清不楚,於是記錄下來希望也能讓同道少走彎路。
假設有一個POST請求的接口是接受一個對象而不是單個參數,如注冊接口,需要傳遞一個MynUser對象,該對象的結構如下:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyUser {
private String username;
private String password;
}
我們的Controller文件中接口是這樣的:
public class UserController {
@Autowired
UserService userService;
@Autowired
TokenService tokenService;
@PostMapping("/register")
public JsonResultObject register(@RequestBody MyUser user) {
// other logic codes, just skip it
return userService.register(user);
}
}
在login方法上傳入的是一個對象LoginUser,需要用到@RequestBody注解。一旦使用了這個注解,Postman的請求頭里面要設置成"Content-Type:application/json"。否則會出現圖1的報錯,然而光是這樣設置還是不夠的。
圖1 unspported Media Type
如果在Postman中使用form-data或者x-www-form-urlencoded方式,如圖2所示,則會有JSON parse error。
圖2 json parse報錯
千萬別以為自己使用的第三方json包出問題了,網上還有人說是因為使用的jackson的版本和Spring Boot版本不匹配,其實真不見得是這個問題。正確的做法是,使用raw方式填寫json字符串即可,如圖3所示:
圖3 成功請求
終於成功注冊了一個用戶,喜大普奔啊!
另外,如果是傳遞單個參數,可以使用@RequestParam,那么Postman就可以使用form-data方式傳遞了,這很簡單。
經過這個事情,讓我想到了幾年前還在寫NodeJS項目的歲月,在和騰訊團隊和yh團隊對接接口的時候,貌似傳遞post參數也是需要用raw方式傳遞,否則那邊處理不了,騰訊微信后台是用的C++,而yh是用的Java(估計是Spring)。
============= 華麗分隔符 ========================
我司正在高薪招聘各種開發人才,北京、廣州 Java高級研發、php高級管理崗位(全國范圍,不限制)、測試、運維高級崗位。請在看機會的同學與我私信聯系,或者加我微信號溝通:UUUUUTW。我是極客君,歡迎優秀人才用簡歷敲門,我真心內推!