改造Mlab请求

时间:2018-03-30 17:57:08

标签: java android retrofit retrofit2 mlab

您好我正在尝试使用使用PUT到我的Mlab服务器的Retrofit发送$addToSet请求。我可以使用Postman做到这一点,但我在使用Retrofit时遇到了麻烦。

该集合如下:

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

post man请求具有API密钥Query,然后$addToSet在主体中传递。 Postman Request 响应是: Postman Response

我想在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作为模型传递,因为它似乎覆盖了所有,我该如何通过呢? 谢谢。

1 个答案:

答案 0 :(得分:1)

@Body Update Query - Retrofit会将传递给它的对象编码为JSON(假设您使用的是Gson转换器,它看起来就是你的)。这就是"n": "'$addToSet': {'completedWalks': 'Kerry Head Cycleway'}} "来自的地方。您需要构建Java对象,就像您的JSON对象一样,以便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中实际发送的内容。  有关设置,请参阅here。然后,您可以比较您的应用发送与邮递员的内容,并查看可能会横向发展的地方。