我試圖通過發送注冊用戶username,password,firstName并lastName從C#客戶端的Java應用程式使用的彈簧。在java 應用程式中,它得到usernameand passwordbutfirstName并lastName丟失。
這是我得到的錯誤:
[org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'firstName' for method parameter type String is not present]
這是我用來將引數發送到 java 應用程式的 c# 方法:
public async Task<User> RegisterUserAsync(string username, string password, string firstName, string lastName)
{
Console.WriteLine("Registering...");
HttpResponseMessage responseMessage =
await Client.GetAsync($"http://localhost:8080/user/register?username={username}&password={password}&firstname={firstName}&lastname={lastName}");
if (responseMessage.StatusCode == HttpStatusCode.OK)
{
string userAsJson = await responseMessage.Content.ReadAsStringAsync();
User resultUser = JsonSerializer.Deserialize<User>(userAsJson);
Console.WriteLine("Registered");
return resultUser; //EXPECTED A USUAL USER TO BE RETURNED
}
throw new Exception("User could not be registered");
}
除錯時顯示所有引數都有正確的值,但java沒有收到它們
Java應用注冊方法:
@GetMapping("/register")
public ResponseEntity<User> ValidateRegister(@RequestParam String username, @RequestParam String password, @RequestParam String firstName, @RequestParam String lastName)
{
try{
System.out.println(username);
User user = userService.ValidateRegister(username,password,firstName,lastName);
if(user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(user);
}
catch (Exception e)
{
System.out.println(e.getMessage());
return ResponseEntity.badRequest().build();
}
}
如果我把firstNameand lastNameas required = false,那么它只用usernameand注冊用戶password。
問題是為何username而password打通,但firstName并lastName不會?
uj5u.com熱心網友回復:
因為你沒有顯式指定引數的名稱,這使得Spring通過變數的名稱來決議引數。它們對你來說是不同的:在С#中你傳遞firstname和lastname,但在java中你的引數被呼叫firstName和lastName
在java代碼中嘗試:
@RequestParam(name = "firstname") String firstName, @RequestParam(name = "lastname") String lastName
或(更好)修復您的 C# 客戶端:
Client.GetAsync($"http://localhost:8080/user/register?username={username}&password={password}&firstName={firstName}&lastName={lastName}");
uj5u.com熱心網友回復:
您在 Java 代碼中對變數名使用駝峰式大小寫:firstName和lastName. 另一方面,請求引數名稱不使用駝峰式大小寫:&firstname=...和&lastname。在這種情況下,我建議在 中明確指定引數的名稱@RequestParam:
@RequestParam("firstname") String firstName
這不是您問題的一部分,但請避免將密碼作為請求引數發送。這將以明文形式發送,您可能希望在請求正文中發送它。此外,GET請求應該用于不修改后端狀態的操作。請使用POST或PUT修改操作,例如注冊用戶。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367627.html
