改造中的Android HttpPost.setEntity()等效

时间:2014-08-28 10:47:44

标签: rest retrofit

我正在尝试对早期使用org.apache包中使用过的类的项目进行改造。

之前我有一个像这样的代码

url.addParameters(url,param); // add query parameters
HttpPost post = new HttpPost(url);
post.setEntity(payload); //InputStreamEntity payload passed as argument

现在在转换为改装时我声明了

@POST ("/x")
CustomClass custom(

    @Query("ctid") String ctid,
    @Body HttpEntity payload
);

然而,这会产生stackoverflow错误,我怀疑是因为

@Body HttpEntity payload

不等同于

HttpPost.setEntity(HttpEntity);

在这种情况下,正确的呼叫是什么。

2 个答案:

答案 0 :(得分:3)

在改造中,@Body可以是在初始化ConverterRestAdapter时使用的TypedOutput可序列化的任何类。

通常,如果您正在处理JSON,您只需创建POJO类,它们将通过Retrofit自动序列化为JSON。如果您没有处理JSON并且可能尝试合并2个库之间的差距,就像您的情况一样,您可以将InputStreamEntity包装到您自己的TypedOutput实现中。

这是一个小例子。

// JSON here is merely used for content, as mentioned use serialization if your content is JSON
String body = "{\"firstname\": \"Parth\", \"lastname\": \"Srivastav\"}";
ByteArrayInputStream inputStream = new ByteArrayInputStream(body.getBytes("UTF-8"));

// Here is your HttpEntity, I've simply created it from a String for demo purposes.
HttpEntity httpEntity = new InputStreamEntity(inputStream, inputStream.available(), ContentType.APPLICATION_JSON);

// Create your own implementation of TypedOutput
TypedOutput payload = new TypedOutput() {
    @Override
    public String fileName() {
        return null;
    }

    @Override
    public String mimeType() {
        return httpEntity.getContentType().getValue();
    }

    @Override
    public long length() {
        return httpEntity.getContentLength();
    }

    @Override
    public void writeTo(OutputStream out) throws IOException {
        httpEntity.writeTo(out);
    }
};

然后像这样定义你的界面

@POST ("/x")
CustomClass custom(
    @Query("ctid") String ctid,
    @Body TypedOutput payload
);

使用上面的payload对象执行它。

api.custom("1", payload);

但如上所述,如果您真的使用JSON,那么这里是一个如何设置代码的快速示例。

让我们说你想要一个

的JSON主体
{
    "firstname": "Parth",
    "lastname": "Srivastav"
}

您将创建一个Java类,您可以将其命名为User let say

public class User {
    public String firstname;
    public String lastname;

    public User(String firstname; String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }
}

像这样修改你的界面

@POST ("/x")
CustomClass custom(
    @Query("ctid") String ctid,
    @Body User payload
);

并像这样使用

api.custom("1", new User("Parth", "Srivastav"));

答案 1 :(得分:1)

在retrofit2中是解决方案:

JSONObject jsonObject = {you jsonObject} //change the json to requestBody
    RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),(jsonObject).toString());

在post方法中,只需使用@ Body,这是一个例子:

Call<Response> getHostList(@Body RequestBody  entery);