android - 改造 api 分解

标签 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);

请注意,这只是为了给您提供想法,但还有更多签名。

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

谢谢

最佳答案

您需要在描述性或保持代码可读性之间做出决定。

你可以看看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);

但是您会丢失调用中可能包含的字段的描述,您需要在其他地方定义这些字段。将此类信息放在一个地方以供将来引用真是太好了,因此解决该问题的方法可能是在代码中添加注释——但随后您的代码又变得困惑了:)

我通常做的事情与上面的示例有点相似:简化的调用接口(interface)用于快速总结,下面的“包装器”方法用于很好地构建这些调用。例如,

@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

}

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

希望这有帮助;)

关于android - 改造 api 分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34858022/

相关文章:

android - 如果 UI 现在可见,服务如何确定

java - 如何通过改造将列表整数发布到 CodeIgniter Rest API 中

php - 无法打开 QEMU 管道 'qemud:network' : Invalid argument

flutter - 无法通过改造 flutter 生成 g.dart

java - 如何使用attach()和detach()而不是add()和remove()来保存 fragment View

c# - 安装 NuGet 包 Xamarin 时出现问题

java - Android opencv相机分辨率低

android - 带 alpha 的颜色的 Android 命名约定是什么?

android - Json 数据未加载到 fragment 中?

android - 如何将模型/POJO 与 android 数据绑定(bind)、房间和改造一起使用?