gpt4 book ai didi

java - Retrofit (java) Reddit Api unsupported_grant_type 错误

转载 作者:搜寻专家 更新时间:2023-11-01 08:23:26 25 4
gpt4 key购买 nike

我正在使用概述的“ token 检索(代码流)”here通过 OAuth2 检索 Reddit Api 的访问 token 。我已设法获得“code”字符串,但在尝试检索访问 token 时出现 unsupported_grant_type 错误。我想使用 Retrofit2 来完成这个。

private void getAccessToken(String code) {

if (mRetrofit == null) {
mRetrofit = new Retrofit.Builder()
.baseUrl(RedditConstants.REDDIT_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
Api api = mRetrofit.create(Api.class);

String authString = RedditConstants.REDDIT_CLIENT_ID + ":";
String encodedAuthString = Base64.encodeToString(authString.getBytes(), Base64.NO_WRAP);

Map<String, String> headers = new HashMap<>();
// headers.put("Content-Type", "application/x-www-form-urlencoded");
// headers.put("Accept", "application/json");
headers.put("Authorization", "Basic " + encodedAuthString);
headers.put("grant_type" , "authorization_code");
headers.put("code", code);
headers.put("redirect_uri", RedditConstants.REDDIT_REDIRECT_URL);
headers.put("User-Agent", RedditConstants.REDDIT_USER_AGENT);

Call<RedditAccessToken> call = api.login(headers, MediaType.parse("application/x-www-form-urlencoded"));
call.enqueue(new Callback<RedditAccessToken>() {
@Override
public void onResponse(Call<RedditAccessToken> call, Response<RedditAccessToken> response) {
Log.d("Findme", "body: " + response.body().toString());
Log.d("Findme", "response: " + response.toString());
}

@Override
public void onFailure(Call<RedditAccessToken> call, Throwable t) {
Log.e("Fineme", "onFailure: " + t.getMessage());
}
});

}

记录结果:

D/Findme: body: RedditAccessToken{scope='null', token_type='null', 
error='unsupported_grant_type', expires_in='0', access_token='null',
refresh_token='null'}
D/Findme: response: Response{protocol=h2, code=200, message=,
url=https://www.reddit.com/api/v1/access_token/}

改造界面:

public interface Api {

@POST("access_token/")
Call<RedditAccessToken> login (
@HeaderMap Map<String, String> headers,
@Header("Content-Type") MediaType contentType
);
}

改造数据模型:

public class RedditAccessToken {

@SerializedName("scope")
@Expose
private String scope;

@SerializedName("token_type")
@Expose
private String token_type;

@SerializedName("expires_in")
@Expose
private long expires_in;

@SerializedName("access_token")
@Expose
private String access_token;

@SerializedName("refresh_token")
@Expose
private String refresh_token;

@SerializedName("error")
@Expose
private String error;

public String getScope() {
return scope;
}

public String getRefresh_token() {
return refresh_token;
}

public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}

public void setScope(String scope) {
this.scope = scope;
}

public String getToken_type() {
return token_type;
}

public void setToken_type(String token_type) {
this.token_type = token_type;
}

public long getExpires_in() {
return expires_in;
}

public void setExpires_in(long expires_in) {
this.expires_in = expires_in;
}

public String getAccess_token() {
return access_token;
}

public void setAccess_token(String access_token) {
this.access_token = access_token;
}

@Override
public String toString() {
return "RedditAccessToken{" +
"scope='" + scope + '\'' +
", token_type='" + token_type + '\'' +
", error='" + error + '\'' +
", expires_in='" + expires_in + '\'' +
", access_token='" + access_token + '\'' +
", refresh_token='" + refresh_token + '\'' +
'}';
}

public String getError() {
return error;
}

public void setError(String error) {
this.error = error;
}
}

最佳答案

我已经解决了错误,现在一切正常。首先,我应该使用 Retrofit Annotation @FormUrlEncoded,它会自动将 mime 类型调整为 application/x-www-form-urlencoded。此外,只需要 HTTP Basic Auth String header 。其他 POST 数据应作为 Retrofit 字段提交。这些更改导致了以下代码。

String authString = RedditConstants.REDDIT_CLIENT_ID + ":";
String encodedAuthString =
Base64.encodeToString(authString.getBytes(), Base64.NO_WRAP);

Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Basic " + encodedAuthString);

Map<String, String> fields = new HashMap<>();
fields.put("grant_type", "authorization_code");
fields.put("code", code);
fields.put("redirect_uri", RedditConstants.REDDIT_REDIRECT_URL);
fields.put("User-Agent", RedditConstants.REDDIT_USER_AGENT);


Call<RedditAccessToken> call = api.login(headers, fields);
call.enqueue(new Callback<RedditAccessToken>()

改造界面:

public interface Api {

@FormUrlEncoded
@POST("access_token/")
Call<RedditAccessToken> login (
@HeaderMap Map<String, String> headers,
@FieldMap Map<String, String> fields
);
}

关于java - Retrofit (java) Reddit Api unsupported_grant_type 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47795356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com