改造 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 中实际发送的内容。
有关设置,请参阅 。然后你可以比较你的应用程序发送的内容与邮递员,看看事情可能会发生什么变化。
您好,我正在尝试使用使用 $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 中实际发送的内容。
有关设置,请参阅