Retrofit @POST参数通过GET发送

3

我想用@QueryMap发送多个参数(像往常一样),但这次是通过POST方法使用retrofit。

retrofit API

@POST("/request.php")
void sendRequest(@QueryMap Map<String, String> parameters, retrofit.Callback<RequestSendResponse> callback);

发送的地图
public static Map<String, String> parametersSendRequest(Context sender, Request request)
{
    Map <String, String> parameters = new HashMap<>();
    Operator operator = AppConfig.config().operator;

    parameters.put("user_name", request.user_name);
    parameters.put("user_surname", request.user_surname);
    parameters.put("user_gender", request.user_gender);
    parameters.put("user_relationship", request.user_relationship);
    parameters.put("user_dob", request.user_dob);
    parameters.put("operator_name", operator.name);
    parameters.put("request_photoid", request.request_photoid);
    parameters.put("request_user_content", request.request_user_content);
    parameters.put("request_title", request.request_title);
    parameters.put("uuid", UUID(sender));
    parameters.put("response_type", "json");
    parameters.put("platform", "android");
    parameters.put("mode", "send");

    return parameters;
}

服务器结果

{"POST":[],"GET":{"operator_name":....}}

我可以看到即使方法被发送到POST@QueryMap也会导致这些参数被以GET方式发送。即使我使用@Body而不是@QueryMap,retrofit仍会将我的@QueryMap转换为JSON对象,这不是我想要的。
我想做的就是在我的请求正文中发送param1=value1&param2=value2,而不是一个JSON对象(使用我的Map<String, String>)。

@Query@QueryMap用于查询字符串参数,您应该使用@Body@Field来处理POST负载。 - hidro
@hidro,感谢您的提示,让我找到了解决方案 :) - Bartu
我想要完整的retrofit @POST参数。 - Pong Petrung
2个回答

5
使用POST方式发送参数(@FormUrlEncoded@FieldMap
@FormUrlEncoded
@POST("/request.php")
void sendRequest(@FieldMap Map<String, String> parameters, retrofit.Callback<RequestSendResponse> callback);

1
这个对我有效。
@FormUrlEncoded
@POST("/profile/")
void getUserProfile(@Field("whatever")String whatever, Callback<Response> callback);

请特别注意在“profile”之后的最后一个斜杠。我因为没有添加它而遇到了问题。希望这能帮到你。

@POST("/profile/"),在这里你不需要在结尾处添加 /,这将由Retrofit库自己处理。 - dharmendra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接