改造api因子分解

时间:2016-01-18 15:12:19

标签: android retrofit

我想知道如果有一种更可读/可操作的方式来编写改装界面而不是我这样做。

我有一个可以采用多个参数的路径,但大多数都是相同的,我用这种方式编写了我的界面:

@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);

请注意,这只是为了给你一个想法,但还有更多的签名。

参数&#34; Hash&#34;添加了,我不得不在每次通话时复制/粘贴它。它感觉不对:)。

由于

1 个答案:

答案 0 :(得分: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

}

通过这种方式,我总是把所有东西放在一个地方,在顶部简化,在下面更详细。

希望这会有所帮助;)