将Retrofit Path参数值映射到返回的对象?

时间:2015-04-23 20:01:03

标签: java android gson retrofit

我了解在定义API接口时如何使用Retrofit的Path参数。例如:

@GET("/users/{id}/profile")
void getUserProfile(@Path("id") int userId, Callback<UserProfile> callback);

我理解设置一个基本类,允许GSON自动将API响应映射到我想要的类。

我的问题是,Retrofit是否支持类成员上的某种注释,当它执行GSON魔术时会自动填充成员的路径值?对于此示例,用户ID在URL路径中作为路径参数但不在响应中,并且我希望将其分配给我返回的对象。

2 个答案:

答案 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,所以我的过程就是这样。

  1. 活动将事件对象“发布”到总线上。那个事件对象 拥有Retrofit发出网络请求所需的所有信息。
  2. 另一个对象(在我的Application类中)订阅了总线和 当从总线接收请求事件时。
  3. 然后我打电话给我的Retrofit api。作为其中的一部分,我创建了一个 回调对象。该回调对象必须实现成功 和失败的方法,但这不是它能做的全部。就我而言,我 在该Callback对象中存储对Otto事件对象的引用。
  4. 当网络操作完成后,Retrofit会调用方法(成功或失败),并且可以使用对事件对象的引用(以及提供给Retrofit的信息)。
  5. 在success方法中,我访问GSON转换的响应,然后使用setter在创建的对象中设置事件对象字段。记住你定义了GSON创建的对象,这样你就可以拥有自己喜欢的任何字段或方法。
  6. 如果您不使用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);
    
    }