У меня есть клиент (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 {}
Вам нужно будет изменить 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 после его создания. Вы можете увидеть пример того, как вы могли бы сделать это Вот
Других решений пока нет …