【问题标题】:Android Java: Retrofit2 + google api auth with email and password gives 404Android Java:Retrofit2 + google api auth with email and password 给出 404
【发布时间】:2020-08-25 17:31:15
【问题描述】:

我已经使用 Firestore 实现了身份验证,它工作正常,现在通过 Google API 重做它并获得 http 状态“404”和空消息:

D/RESPONSE FIREBASE: Response{protocol=h2, code=404, message=, url=https://identitytoolkit.googleapis.com/v1/accounts/signInWithPassword?key=000080511101}

网络服务:

public class NetworkService {
    private static NetworkService instance;
    private static final String BASE_URL
        = "https://identitytoolkit.googleapis.com/v1/";
    private Retrofit retrofit;

    private NetworkService() {
        retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    }

    public static NetworkService getInstance() {
        if (instance == null) {
            instance = new NetworkService();
        }
        return instance;
    }

    public PlaceHolderApi getJsonApi() {
        return retrofit.create(PlaceHolderApi.class);
    }
}

API

public interface PlaceHolderApi {

@FormUrlEncoded
@POST("accounts/signInWithPassword")
Call<Transaction.Result> loginWithEmail(
    @Query("key") String key,
    @Field("email") String email,
    @Field("password") String password,
    @Field("returnSecureToken") boolean returnSecureToken
    );

}

用法:

    NetworkService.getInstance()
        .getJsonApi().loginWithEmail("000080511101", email, password, true)
        .enqueue(new Callback<Transaction.Result>() {
            @Override
            public void onResponse(Call<Transaction.Result> call, Response<Transaction.Result> response) {
                Log.d("RESPONSE FIREBASE", response.toString());
                Log.d("RESPONSE MESSAGE", response.message());
            }

            @Override
            public void onFailure(Call<Transaction.Result> call, Throwable t) {
                t.printStackTrace();
            }
        });

文档说我应该使用内容类型 application/JSON,但是如何在这里使用它或使用改造通过 http 传递它? 任何指示都会有所帮助。

谢谢!

UPD:控制台查询结果

【问题讨论】:

标签: java android google-cloud-firestore google-api retrofit2


【解决方案1】:

真正的问题是因为 url ":" 中的冒号符号,所以 url 应该从点和斜杠符号 "./" 开始:

    @POST("./accounts:signInWithPassword")

在 github 上找到了这个,它可以帮助https://github.com/square/retrofit/issues/2730

UPD:解释一下为什么我使用像 "accounts/signInWithPassword" 这样的 url,里面带有斜杠符号而不是冒号符号:我先尝试使用冒号,但得到一个错误“格式错误的 url”,所以我对这个错误进行了更深入的挖掘 :)

【讨论】:

    【解决方案2】:

    您可以像这样添加标题。但我认为如果你错过了标头响应,错误代码就不会是 404。

    不管怎样,试试这个。

    @FormUrlEncoded
    @Headers({"Content-Type: application/json"})
    @POST("accounts/signInWithPassword")
    Call<Transaction.Result> loginWithEmail(
        @Query("key") String key,
        @Field("email") String email,
        @Field("password") String password,
        @Field("returnSecureToken") boolean returnSecureToken
    );
    

    【讨论】:

    • 谢谢,但不起作用,仍然得到 404。似乎我使用了错误的 url,但正确的 url 是什么样的?
    • 我不太确定,但他们的文档 URL 不是 accounts/signInWithPassword 它是 accounts:signInWithPassword
    • 没错,但如果我在@Post 中更改网址并设置“/”而不是“:” - 在这种情况下会出现错误“网址格式错误”。
    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2022-12-02
    • 2021-11-02
    • 2015-11-13
    相关资源
    最近更新 更多