Selaa lähdekoodia

fix(auth):修复密码登录响应解析问题

- 修改密码登录接口返回类型为ResponseBody
- 增加对登录响应体的字符串解析处理- 添加对OAuth2TokenResponse解析失败的异常处理- 实现登录失败时的错误提示逻辑
-优化网络请求异常处理流程
- 注释掉MQTT连接状态的Toast提示
mws 3 kuukautta sitten
vanhempi
commit
732bdb15ce

+ 2 - 2
app/src/main/java/com/paul/drone/MainActivity.java

@@ -401,13 +401,13 @@ public class MainActivity extends AppCompatActivity implements DeviceConnectionM
                 Log.i(TAG, "断开 MQTT 连接");
                 isMqttConnected = false;
                 mqttService.disconnectMqtt();
-                Toast.makeText(this, "MQTT 已断开", Toast.LENGTH_SHORT).show();
+//                Toast.makeText(this, "MQTT 已断开", Toast.LENGTH_SHORT).show();
             } else {
                 // 连接 MQTT
                 Log.i(TAG, "连接 MQTT");
                 isMqttConnected = true;
                 mqttService.connectMqtt();
-                Toast.makeText(this, "MQTT 已连接", Toast.LENGTH_SHORT).show();
+//                Toast.makeText(this, "MQTT 已启动,请稍后...", Toast.LENGTH_SHORT).show();
             }
 
         } else {

+ 2 - 1
app/src/main/java/com/paul/drone/network/ChinaTowerApiService.java

@@ -8,6 +8,7 @@ import com.paul.drone.data.SmsCodeResponse;
 import com.paul.drone.data.UpdateInfoRequest;
 import com.paul.drone.data.UpdateInfoResponse;
 
+import okhttp3.ResponseBody;
 import retrofit2.Call;
 import retrofit2.http.Body;
 import retrofit2.http.Field;
@@ -40,7 +41,7 @@ public interface ChinaTowerApiService {
      */
     @FormUrlEncoded
     @POST("/hntt-auth/auth/oauth2/token")
-    Call<OAuth2TokenResponse> getOAuth2TokenByPassword(
+    Call<ResponseBody> getOAuth2TokenByPassword(
             @Header("Authorization") String authorization,
             @Field("username") String username,
             @Field("password") String password,

+ 30 - 13
app/src/main/java/com/paul/drone/repository/NetworkRepository.java

@@ -232,7 +232,7 @@ public class NetworkRepository {
 
         return Single.fromCallable(() -> {
                     try {
-                        retrofit2.Response<OAuth2TokenResponse> response = chinaTowerApiService.getOAuth2TokenByPassword(
+                        retrofit2.Response<ResponseBody> response = chinaTowerApiService.getOAuth2TokenByPassword(
                                 AuthUtil.generateDefaultBasicAuth(), // 默认Basic Auth
                                 username,
                                 password,
@@ -241,23 +241,40 @@ public class NetworkRepository {
                         ).execute();
 
                         if (response.isSuccessful() && response.body() != null) {
-                            OAuth2TokenResponse tokenResponse = response.body();
-                            // 保存token
-                            sessionManager.saveAuthTokenWithExpiry(tokenResponse.getAccessToken(), tokenResponse.getExp());
-                            // 保存用户数据
-                            sessionManager.saveUserData(tokenResponse);
-                            // 保存刷新token
-                            sessionManager.saveRefreshToken(tokenResponse.getRefreshToken());
-
-                            Log.i(TAG, "密码登录成功");
-                            return tokenResponse;
+                            // 获取响应体字符串
+                            String responseBodyString = response.body().string();
+                            Log.i(TAG, "密码登录响应: " + responseBodyString);
+                            try {
+                                // 先尝试解析为OAuth2TokenResponse
+                                OAuth2TokenResponse tokenResponse = JsonUtil.fromJson(responseBodyString, OAuth2TokenResponse.class);
+
+                                // 检查关键字段是否有效
+                                if (tokenResponse.getAccessToken() != null && !tokenResponse.getAccessToken().isEmpty()) {
+                                    // 保存token
+                                    sessionManager.saveAuthTokenWithExpiry(tokenResponse.getAccessToken(), tokenResponse.getExp());
+                                    // 保存用户数据
+                                    sessionManager.saveUserData(tokenResponse);
+                                    // 保存刷新token
+                                    sessionManager.saveRefreshToken(tokenResponse.getRefreshToken());
+
+                                    Log.i(TAG, "密码登录成功");
+                                    return tokenResponse;
+                                } else {
+                                    // 可能是错误响应
+                                    throw new RuntimeException("用户名或密码错误");
+                                }
+                            } catch (Exception parseException) {
+                                // 如果解析失败,认为是错误响应
+                                Log.e(TAG, "解析响应失败,可能是错误响应: " + parseException.getMessage());
+                                throw new RuntimeException("用户名或密码错误");
+                            }
                         } else {
                             Log.e(TAG, "密码登录失败: " + response.message());
-                            throw new IOException("登录失败: " + response.message());
+                            throw new RuntimeException(response.message());
                         }
                     } catch (Exception e) {
                         Log.e(TAG, "密码登录异常: " + e.getMessage(), e);
-                        throw new IOException("网络请求失败: " + e.getMessage());
+                        throw new RuntimeException(e.getMessage());
                     }
                 }).subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread());