您好我正在尝试使用使用PUT
到我的Mlab服务器的Retrofit发送$addToSet
请求。我可以使用Postman做到这一点,但我在使用Retrofit时遇到了麻烦。
该集合如下:
[
{
"_id": {
"$oid": "5abe74bac2ef1603f4045686"
},
"email": "test@gmail.com",
"completedWalks": [
"South Leinster Way"
],
"favWalks": []
}
]
post man请求具有API密钥Query,然后$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
作为模型传递,因为它似乎覆盖了所有,我该如何通过呢?
谢谢。
答案 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。然后,您可以比较您的应用发送与邮递员的内容,并查看可能会横向发展的地方。