【问题标题】:Retrofit @Body showing up as parameter in HTTP request改造 @Body 在 HTTP 请求中显示为参数
【发布时间】:2013-09-25 08:01:40
【问题描述】:

我之前已成功使用 Square 的 Retrofit 进行 @GET Web API 调用,但是当尝试在服务器 (Rails) 上的 @POST 调用中将 JSON 作为 @BODY 发送时JSON 显示为参数而不是正文请求。

我的理解是@BODY会将该方法参数添加到body中的请求中。

知道我做错了什么吗?

WebApi

@POST("/api/v1/gear/scans.json")
Response postScans(
    @Header(HEADER_AUTH) String token,
    @Body JsonObject scans
);

发出网络请求:

RestAdapter restAdapter = new RestAdapter.Builder()
    .setServer(api_url)
    .build();
WebApi webApi = restAdapter.create(AssetsWebApi.class);     
Response response = webApi.postScans(auth_token, valid_json);

【问题讨论】:

    标签: android ruby-on-rails http-post retrofit


    【解决方案1】:

    原来如果你想POST数据作为请求体的一部分,你需要将API接口方法注解为@FormUrlEncoded,并将body的内容作为@Field传递如下:

    @FormUrlEncoded
    @POST("/api/v1/gear/scans.json")
    Response postScans(
        @Header(HEADER_AUTH) String token,
        @Field("scans") JsonArray scans
    );
    

    @Rickster 的异步调用:

    @POST("/api/v1/gear/scans.json") 
    void postScans(
        @Header(HEADER_AUTH) String token,
        @Body JsonObject scans,
        Callback<PostSuccessResponseWrapper> callback
    );
    

    【讨论】:

    • 你如何做这个的异步版本?当我添加回调时,我得到一个异常 - stackoverflow.com/questions/22572301/…
    • @Rickster 我怀疑您的问题与您的 @DELETE 注释有关,但我对此并不熟悉 - 我只做过 @GET@POST 电话。我的异步调用在上面进行了编辑。
    • 很好的答案。奇怪的是你不能做@Body String param_name,但你必须做@Field("param") String param_name,在@POST之前你需要注释@FormUrlEncoded;)但因为这是完美的解决方案,我同意。谢谢!
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多