我了解在定义API接口时如何使用Retrofit的Path参数。例如:
@GET("/users/{id}/profile")
void getUserProfile(@Path("id") int userId, Callback<UserProfile> callback);
我理解设置一个基本类,允许GSON自动将API响应映射到我想要的类。
我的问题是,Retrofit是否支持类成员上的某种注释,当它执行GSON魔术时会自动填充成员的路径值?对于此示例,用户ID在URL路径中作为路径参数但不在响应中,并且我希望将其分配给我返回的对象。
答案 0 :(得分:0)
我唯一的想法是解决方法而不是答案:使用两个回调。一个在接口方法中定义并由调用者提供,另一个在辅助类中调用第二个本地回调调用RestAdapter生成的服务。本地回调接收实际响应,分配我想要的缺失值,并将完成的对象提供给调用者提供的回调?比如这样的东西,例如...但它看起来有点像hacky:
public void getUserProfile(final int userId, final Callback<UserProfile> callback)
{
Callback<UserProfile> cb = new Callback<UserProfile>()
{
@Override
public void success(UserProfile userProfile, Response response)
{
userProfile.userId = userId;
callback.success(userProfile, response);
}
@Override
public void failure(RetrofitError error)
{
callback.failure(error);
}
};
myService.getUserProfile(userId, cb);
}
答案 1 :(得分:0)
我在创建时将请求信息粘贴到回调中。然后,当Retrofit调用成功或失败方法时,可以在成功或失败方法中使用信息。
我使用Square的Otto事件总线和Retrofit,所以我的过程就是这样。
如果您不使用Otto,您仍然可以使用相同的过程,只需将您想要的信息以相同的方式传递给您的回复。
以下是我的一个项目粘贴的一些代码,用于演示我上面描述的内容。
@Subscribe
public void onSignup(SignupRequest event) {
MyLog.p(this,"inside api repo - making signup request");
mRailsApi.signup(event, new RailsApiCallback<SignupRequest,SignupResponse>(mBus, event, new SignupResponse()));
}
@POST(API_URL + "/signup")
void signup(@Body UserRequestParams requestParams,
Callback<SignupResponse> tokenParms);
public class RailsApiCallback<T,S extends BaseResponse> implements Callback<S> {
private Bus mBus;
private S mResponse;
private T mRequestEvent;
@Inject PersistData mPersistData;
@Inject @ForApplication Context mContext;
@Inject MyApp mMyApp;
public RailsApiCallback(Bus bus, T requestEvent, S response) {
super();
mBus = bus;
mResponse = response;
mRequestEvent = requestEvent;
mResponse.setRequestEvent(requestEvent);
Injector.getInstance().inject(this);
}
@Override
public void success(S convertedResponse, Response rawResponse) {
MyLog.p(this,String.format("response body = %s",rawResponse.getBody()));
S response = convertedResponse != null ? convertedResponse : mResponse ;
response.setSuccessful(true);
response.setRawResponse(rawResponse);
response.setRequestEvent(mRequestEvent);
mBus.post(response);
}