Java — объект GSON (RESTful API)

У меня есть клиент (Java), который отправляет некоторые данные JSON на мой сервер (C ++). После этого мой сервер отвечает с некоторыми сведениями в зависимости от операции, выполненной моим Java-клиентом. На данный момент его работы.

Example body request:
{
"userEmail": "[email protected]",
"userPassword": "12345678"}

И сервер, получите адрес электронной почты и пароль, выполните операции и отправьте ответ.

Но теперь мне нужно изменить мой Java-клиент, чтобы отправить запрос следующим образом:

{
"userInformation":{
"userEmail": "[email protected]",
"userPassword": "12345678"}

}

Этот запрос можно использовать для входа в систему. Это очень сложная архитектура, поэтому я не могу скопировать весь код, но в классе входа в систему я использовал gson (заметьте, я работаю только на сервере c ++, я не работаю на клиенте, и невозможно связаться с парнем, который сделал клиент java, чтобы спросить его насчет этого сомнения)

Java-клиент — класс входа

public final String userEmail;
public final String userPassword;public LoginRequestArgs( String userEmail, String userPassword)
{
this.userEmail = userEmail;
this.userPassword = userPassword;
}

public static LoginRequestArgs fromStringJson(String data)
{
try
{
Gson gson = new Gson();
return gson.fromJson(data, LoginRequestArgs.class);
}
catch(Exception e)
{
return null;
}
}

public static LoginRequestArgs fromBytesJson(byte[] data)
{
if (data == null) return null;
try
{
String str = new String(data, "utf-8");
return fromStringJson(str);
}
catch (Exception e)
{
return null;
}
}@Override
public String toJsonString()
{
try
{
Gson gson = new Gson();
return gson.toJson(this);
}
catch(Exception e)
{
return null;
}
}

@Override
public byte[] toJsonBytes()
{
try
{
return this.toJsonString().getBytes("utf-8");
}
catch (Exception e)
{
return null;
}
}

У меня есть другой класс, который подключается к моему серверу и отправляет запрос. Этот класс вызывает функцию входа в систему (запрос является переменной SerializableJSON) и помещает этот запрос на мой сервер. request = LoginRequestArgs.fromStringJson(args.httpEntity);

(для тестов я использую расширение chrome одного отдыхающего клиента)

Я знаю, что это может быть трудно понять, но нелегко объяснить все вещи. Я пытаюсь объяснить самое важное.

реальная проблема: я не могу настроить Java-клиент для отправки электронной почты и пароля, которые находятся внутри «userInformation». Кто-нибудь может мне помочь, пожалуйста? Спасибо

РЕДАКТИРОВАТЬ (ПРИМЕР ДРУГОГО ТЕЛА):

{
"userInformation": {
"otherSection": {
"key1": "value1",
"key2": "value2"}
}
}

РЕДАКТИРОВАТЬ 2 (метод аутентификации):

{
"authenticationMethod": {
"sessionId": {
"email": "[email protected]",
"password": "pass123"}
},
"userInformation": {
"userId": "user",
"userPassword": "user123"}
}

РЕДАКТИРОВАТЬ 3 (ТОКЕН):

{
"authenticationMethod": {
"token": {
"token": "HDI393UDDNDMAY4758SAD"}
},
"userInformation": {
"userId": "user",
"userPassword": "user123"}
}

РЕДАКТИРОВАТЬ 4:

{
"sessionId":{
"email":"[email protected]",
"password":"dasdas"
},
"userInformation":{
"userId": "userId1",
"userPassword": "12345678"}

}

Я уже отправляю этот json на мой сервер c ++, и его работа и мой идентификатор сеанса декодирования тоже работают, для меня это не проблема для работы на c ++. Но мне нужно отправить sessionId (или токен), но внутри «AuthenticationMethod», это единственное, что мне нужно реализовать сейчас. Обратите внимание на «userInformation», это как и пример, это может быть, например, «bookInformation», «carInformation», в зависимости от типа запроса, я отправляю разные данные с разными ключами / значениями внутри … но метод аутентификации (идентификатор сеанса или токен) это Всегда обязательно использовать во всех запросах.

Чтобы работать так, как я вам показываю, я реализую это:

public class SessionId {

public String email;
public String password;

public SessionId(String email, String password)
{
this.email = email;
this.password = password;
}

}

И внутри конструкции моего класса (может быть, например, один класс, такой как LoginRequestArgs, cass для входа в систему), я называю super:

public UserInfo userInformation;
public SessionId sessionId;

public LoginRequestArgs(String email, String password,String userEmail, String userPassword)
{
super(email,password);
userInformation = new UserInfo(userEmail, userPassword);
}static class UserInfo {
public String userId;
public String userPassword;

public UserInfo(String userEmail, String userPassword) {
this.userId = userEmail;
this.userPassword = userPassword;
}
}

Так что сейчас мне нужно только добавить «authenticationMethod» перед идентификатором сессии или токеном (я считаю, что способ сделать это одинаков для обоих)

**** РЕДАКТИРОВАТЬ 5 ********

login.java

public class LoginRequestArgs implements SerializableJSON  {

public UserInfo userInformation;
public AuthenticationMethod authenticationMethod;

public LoginRequestArgs(String email, String password,String userId, String userPassword)
{
AuthenticationMethod auth = new SessionId(email, password);
setAuth(auth);
userInformation = new UserInfo(userId, userPassword);
}

public void setAuth(AuthenticationMethod authenticationMethod){
this.authenticationMethod = authenticationMethod;
}

static class UserInfo {
public String userId;
public String userPassword;

public UserInfo(String userEmail, String userPassword) {
this.userId = userEmail;
this.userPassword = userPassword;
}
}

SessionId.java

public class SessionId extends AuthenticationMethod {

Session sessionId;

public SessionId(String email, String password)
{
this.sessionId = new Session(email,password);

}

static class Session{
String email;
String password;

public Session(String email, String password)
{
this.email = email;
this.password = password;
}

}
}

AuthenticationMethod.java

public class AuthenticationMethod {}

0

Решение

Вам нужно будет изменить LoginRequestArgs класс, чтобы выглядеть примерно так:

public class LoginRequestArgs {

public UserInfo userInformation;

public LoginRequestArgs(String userEmail, String userPassword) {
userInformation = new UserInfo(userEmail, userPassword);
}

static class UserInfo {
public String userEmail;
public String userPassword;

public UserInfo(String userEmail, String userPassword) {
this.userEmail = userEmail;
this.userPassword = userPassword;
}
}

public static LoginRequestArgs fromStringJson(String data) {
try {
Gson gson = new Gson();
return gson.fromJson(data, LoginRequestArgs.class);
} catch (Exception e) {
return null;
}
}

public static LoginRequestArgs fromBytesJson(byte[] data) {
if (data == null)
return null;
try {
String str = new String(data, "utf-8");
return fromStringJson(str);
} catch (Exception e) {
return null;
}
}

}

и вот как вы можете получить доступ к электронной почте и паролю:

loginRequestArgsInstance.userInformation.userEmail;
loginRequestArgsInstance.userInformation.userPassword;

Вам, вероятно, следует добавить несколько методов получения и установки в этот класс или, по крайней мере, убедиться, что userInformation не является null,

Есть несколько способов включить детали сеанса в JSON. Одним из способов будет изменение ваших классов Java. Что-то вроде этого:

Req.java

public class Req{
String data1;
String data2;
Auth authenticationMethod;
....
public void setAuth(Auth authenticationMethod){
this.authenticationMethod = authenticationMethod;
}
}

Auth.java

public class Auth{
....
}

AuthToken.java

public class AuthToken extends Auth {

Token token;

public AuthToken(String token) {
this.token = new Token(token);
}

static class Token {
String token;

public Token(String token) {
this.token = token;
}

}
}

AuthUserInfo.java

public class AuthUserInfo extends Auth {

UserInfo sessionId;

public AuthUserInfo(String email, String password) {
this.sessionId = new UserInfo(email, password);
}

static class UserInfo {
String email;
String password;

public UserInfo(String email, String password) {
this.email = email;
this.password = password;
}
}
}

А вот как вы можете использовать эти классы:

Req req = new Req(...);
Auth auth = new AuthToken(...);// OR: new AuthUserInfo(...);
req.setAuth(auth);
String json = new Gson().toJson(req);

Другим способом будет добавление новых свойств в JSON после его создания. Вы можете увидеть пример того, как вы могли бы сделать это Вот

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]