如何使用Square的改进将多维哈希作为查询参数传递

时间:2014-08-15 21:29:46

标签: java android retrofit

我有一个字符串ID和点的地图,我需要从中生成类似于此的路径:

.../?assessment[id_1][points]=3&assessment[id_2][points]=5

我不确定如何在改造中做这样的事情。 我尝试手动生成字符串并将其附加到请求的末尾

@PUT("/path/to/api/{assessment}?{}")
    void postScore(@Path("assessment") String rubricAssessment, Callback<Submission> callback);

哪个非常hacky并导致错误。

java.lang.IllegalArgumentException: Inteface.postScore: URL query string "{assessment}" must not have replace block.

有人建议在改造中采用更好的方法来实现这一目标吗?

感谢您阅读我的问题。

编辑:

我发现一种可能的解决方案是使用QueryMap或FieldMap,但仍需要我创建一个辅助方法来手动构建每个键值。像这样:

 private static String getFieldMap(Map<String,String> map){
    Map<String, String> fieldMap = new HashMap<String, String>();
    for (Map.Entry<String, String> entry : map.entrySet())) {
        map.put("assessment[" +entry.getCriterionId() +"][points]", String.valueOf(entry.getPoints()));
    }
    return fieldMap;
}

然后将地图传递给这样的东西?

 @put("/things")
 void things(@FieldMap Map<String, String> fields);
 }

这是最好的方法吗?任何反馈都表示赞赏。

1 个答案:

答案 0 :(得分:3)

你是对的。你确实可以使用QueryMap。说实话,从来没有尝试使用FieldMap,因为QueryMap对我来说非常好。

如果你想使用queryMap,这很简单。例如:

Map testMap = new HashMap<String,String>();
    testMap.put("key1", "value1");
    testMap.put("key2", "value2");

并将其传递给您postScore call。

something.postScore("yourStringValue",testMap);

您的改装电话应如下所示:

void postScore(@Path("assessment") String rubricAssessment, @QueryMap Map<String,String> callback)

希望这有帮助。