改造 Mlab 的 Put 请求

Retrofit Put Request for Mlab

您好,我正在尝试使用使用 $addToSet 的 Retrofit 向我的 Mlab 服务器发送 PUT 请求。我可以使用 Postman 执行此操作,但使用 Retrofit 时遇到问题。

集合看起来像:

[
    {
        "_id": {
            "$oid": "5abe74bac2ef1603f4045686"
        },
        "email": "test@gmail.com",
        "completedWalks": [
            "South Leinster Way"
        ],
        "favWalks": []
    }
]

post man 请求有 API 键,查询,然后 $addToSet 就这样在正文中传递。 响应是:

我正在尝试在 android 中这样做。 改造:

@PUT("databases/walks/collections/user")
Call<Update> addCompleted (@Query("apiKey") String apiKey,@Query("q") String Email, @Body Update Query);

我的模型:

public class Update {

    @SerializedName("n")
    private String n;

    public String getN() {
        return n;
    }

    public Update(String n) {
        this.n = n;
    }
}

正在创建更新对象:

String updateComplete = String.format("'$addToSet': {'completedWalks': '%s'}} ", TrailName);
final String query =String.format("{'email': '%s'}",email) ;

final Update queryComplete = new Update(updateComplete);

请求:

Call<Update> completeCall = apiService.addCompleted(mlabAPi, query, queryComplete);
completeCall.enqueue(new Callback<Update>() {
    @Override
    public void onResponse(Call<Update> call, Response<Update> response) {           
       Toast.makeText(getApplicationContext(),"Walk marked as Complete", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailure(Call<Update> call, Throwable t) {
        Log.e(TAG, t.getMessage());
    }
});

但这只会覆盖集合中的内容,我有:

[
    {
        "_id": {
            "$oid": "5abe74bac2ef1603f4045686"
        },
        "n": "'$addToSet': {'completedWalks': 'Kerry Head Cycleway'}} "
    }
]

有谁知道我哪里出错了,我不应该将 $addToSet 作为模型传递,因为它似乎覆盖了所有内容,那我该如何传递呢? 谢谢。

@Body Update Query -- Retrofit 会将传递给它的对象编码为 JSON(假设您使用的是 Gson 转换器,它看起来就是这样)。这就是 "n": "'$addToSet': {'completedWalks': 'Kerry Head Cycleway'}} " 的来源。您需要构建与 JSON 对象相同的 Java 对象,以便 gson 正确序列化它。

我不熟悉 mlab api,但从你的邮递员看来,你想要一个像这样的请求正文 --

public class UpdateRequest {
    @SerializedName("$addToSet")
    Map<String, String> addToSet = new HashMap();
}   

更新您的界面以将此对象作为正文发送 --

@PUT("databases/walks/collections/user")
Call<Update> addCompleted (@Query("apiKey") String apiKey,@Query("q") String Email, @Body UpdateRequest Query);

并创建请求主体 --

UpdateRequest requestBody = new UpdateRequest();
requestBody.addToSet.put("completedWalks", Trailname);

并创建调用 --

Call<Update> completeCall = apiService.addCompleted(mlabAPi, query, requestBody);

为了进一步调试,您可以通过将 HttpLoggingInterceptor 添加到改造实例来查看 logcat 中实际发送的内容。 有关设置,请参阅 。然后你可以比较你的应用程序发送的内容与邮递员,看看事情可能会发生什么变化。