Неожиданный токен # в JSON в позиции 0 Ошибка в Android Studio при использовании Retrofit2 - PullRequest
1 голос
/ 07 мая 2019

У меня проблема с «Неожиданным токеном # в JSON в позиции 0».

Я хочу удалить FirebaseUser с помощью CloudFunction на Firebase.

Нет возврата, но ошибкаговорит, что "есть неожиданный токен json #"

Вот некоторые коды:

  • CloudFunctionsService (Interface)
public interface CloudFunctionsService {

    @POST("deleteUser")
    Call<Void> deleteUser(@Body String uid);
}

  • FunctionRetrofit(RetrofitClass)
public class FunctionRetrofit {
    private static FunctionRetrofit instance = new FunctionRetrofit();

    public static FunctionRetrofit getInstance(){
        return instance;
    }

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    private CloudFunctionsService cfs = retrofit.create(CloudFunctionsService.class);
    public CloudFunctionsService getService(){
        return cfs;
    }

}
  • функция deleteUser (для FirebaseCloudFunction)
exports.deleteUser = functions.https.onRequest((req, res) => {
    if (req.body.uid === undefined) {
      res.status(400).send('No user id defined');
    } else {
      var userId = req.body.uid;

      admin.auth().deleteUser(userId)
          .then(function() {
              console.log("Successfully deleted user");    
          })
          .catch(error=> {
              console.log("Error deleting user: ", error);
          });

      res.status(200).end();
    } 
  });

  • Результат выполнения кода (Activity) успешен, но на самом деле это не такизменил что-нибудь
Call<Void> res = FunctionRetrofit.getInstance().getService().deleteUser(user.getUid());
                res.enqueue(new Callback() {
                    @Override
                    public void onResponse(Call call, Response response) {
                        Log.d("success", "suceess");

                    }

                    @Override
                    public void onFailure(Call call, Throwable t) {
                        Log.e("Error", t.getMessage().toLowerCase());
                    }
                });

  • Ошибка
SyntaxError: Unexpected token # in JSON at position 0
    at JSON.parse (<anonymous>)
    at createStrictSyntaxError (/worker/node_modules/body-parser/lib/types/json.js:157:10)
    at parse (/worker/node_modules/body-parser/lib/types/json.js:83:15)
    at /worker/node_modules/body-parser/lib/read.js:121:18
    at invokeCallback (/worker/node_modules/raw-body/index.js:224:16)
    at done (/worker/node_modules/raw-body/index.js:213:7)
    at IncomingMessage.onEnd (/worker/node_modules/raw-body/index.js:273:7)
    at emitNone (events.js:106:13)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)

1 Ответ

3 голосов
/ 07 мая 2019

Поскольку вы используете GsonConverterFactory, я думаю, что он ожидает json (или сериализацию в JSON), когда вы используете аннотацию @Body. Поскольку вы передаете необработанное строковое значение, я думаю, что именно здесь оно ошибается.

Пожалуйста, не обращайте внимания на ответ выше. GsonConverterFactory будет сериализовать ваш собственный тип в JSON, однако вы отправляете необработанное строковое значение. Это не будет сериализовано, поэтому тело сообщения с идентификатором 3 будет "3" - я думаю, что API, который вы вызываете для deleteUser, ожидает JSON в теле, которое вы не отправляете, поэтому вы получаете сообщение об ошибке , Я бы проверил документы API-вызова Firebase, который вы делаете, чтобы увидеть, в каком формате ожидается публикация тела сообщения. Скорее всего это будет что-то вроде:

{
    "userId": "3"
}

Если это так, то вам понадобится такой класс:

public class User {
    private String userId;

    public User(String userId){
        this.userId  = userId;
    }
}

В настоящее время вы отправляете символ "в качестве первого символа, когда он, вероятно, ожидает {для обозначения запуска объекта JSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...