2016-01-18 18 views
2

我想知道是否有一个更可读/可支持的方式来编写改造界面,而不是我如何做。改造api因子化

我有可能需要几个参数相同的路线,但其中大部分是相同的,我写我的界面是这样的:

@FormUrlEncoded 
@POST("/api/questions/{questionid}/response") 
Call <QuestionAnswerResponse> postResponse(@Path("questionid") String questionId, 
@Field("course") String courseId, 
@Field("self") String self, 
@Field("hash") String hash, 
@Field("sessionId") String sessionId); 

@FormUrlEncoded 
@POST("/api/questions/{questionid}/response") 
Call <QuestionAnswerResponse> postResponse(@Path("questionid") String questionId, 
@Field("course") String courseId, 
@Field("self") List <Integer> self, 
@Field("hash") String hash, 
@Field("sessionId") String sessionId); 

@FormUrlEncoded 
@POST("/api/polls/{questionid}/response") 
Call <QuestionAnswerResponse> postPollResponse(@Path("questionid") String questionId, 
@Field("course") String courseId, 
@Field("self") List <Integer> self, 
@Field("hash") String hash, 
@Field("sessionId") String sessionId); 

@FormUrlEncoded 
@POST("/api/questions/{questionid}/response") 
Call <QuestionAnswerResponse> postResponse(@Path("questionid") String questionId, 
@Field("course") String courseId, 
@Field("self[text]") String text, 
@Field("self[medias]") List <String> medias, 
@Field("hash") String hash, 
@Field("sessionId") String sessionId); 

@FormUrlEncoded 
@POST("/api/polls/{questionid}/response") 
Call <QuestionAnswerResponse> postPollResponse(@Path("questionid") String questionId, 
@Field("course") String courseId, 
@Field("self[text]") String text, 
@Field("self[medias]") List <String> medias, 
@Field("hash") String hash, 
@Field("sessionId") String sessionId); 

@FormUrlEncoded 
@POST("/api/questions/{questionid}/response") 
Call <QuestionAnswerResponse> postResponse(@Path("questionid") String questionId, 
@Field("course") String courseId, 
@Field("self[x]") Integer x, 
@Field("self[y]") Integer y, 
@Field("hash") String hash, 
@Field("sessionId") String sessionId); 

注意这仅仅是给你的想法,但有甚至更多的签名。

参数“哈希”已添加,我不得不在每次调用时复制/粘贴它。它感觉不对:)。

谢谢

回答

1

您需要决定是描述性还是保持代码可读性。

你可以看看FieldMap,这将使您的通话清洁,如:

@FormUrlEncoded 
@POST("/api/questions/{questionid}/response") 
Call <QuestionAnswerResponse> postResponse(@Path("questionid") String questionId, 
@Field("course") String courseId, 
@Field("self") String self, 
@Field("hash") String hash, 
@Field("sessionId") String sessionId); 

将改变为:

@FormUrlEncoded 
@POST("/api/questions/{questionid}/response") 
Call <QuestionAnswerResponse> postResponse(@Path("questionid") String questionId, 
@FieldMap Map<String, Object> fields); 

但你失去了可包含在字段的描述调用,你需要在其他地方定义字段。它很高兴有这样的信息在一个地方供将来参考,所以解决方案可能会添加注释代码 - 但随后你再次凌乱你的代码:)

我通常做的,有点类似于上面的例子:简化的调用界面,用于快速总结以及下面的“包装器”方法,用于很好地构建这些调用。例如,

@FormUrlEncoded 
@POST("/api/questions/{questionid}/response") 
Call <QuestionAnswerResponse> postResponse(@Path("questionid") String questionId, 
@FieldMap Map<String, Object> fields); 

... 

public static void postResponse(String courseId, String self, String hash, String sessionId){ 
    Map<String, String> map = new HashMap<>(); 
    map.put("course", courseId); 
    map.put("self", self); 
    map.put("hash", hash); 
    map.put("sessionId", sessionId); 

    // ... here you build your call with FieldMap params provided 

} 

这样,我总是在一个地方的所有东西,在上面简化和下面更详细。

希望这会有帮助;)

+0

谢谢你有时间回答我这个问题。根据我的理解,对于每个呼叫权,我仍然会拥有1个具有相同参数的签名?并且在他们中的每一个中,我会将字段“散列”添加到该字段映射中。我宁愿寻找一种将字段“添加”到永远存在的一组字段的方法。但也许我可以尝试一下FieldMap –

+0

好吧,我在这里看到了另一个简单而流行的解决方案:如果您总是为每个调用添加一个散列,那么创建一个请求拦截器会很明智。对不起,在这里没有提供的例子,但你会发现很多互联网:) –

+0

是的我已经有一些参数的拦截器,但我不认为他们应该在这里使用。 –