【问题标题】:How to get gziped xml files with retrofit?如何通过改造获得 gziped xml 文件?
【发布时间】:2016-09-24 22:32:54
【问题描述】:

我正在使用改造从网络获取数据。现在我的问题是我必须得到一个 gziped 文件,并且改造需要一些我不知道如何正确实施的标头,显然。我对此进行了研究,但似乎没有任何帮助,因为大多数开发人员都在使用 json。

这是我想要做的:

  Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("this is my baseurl")
            .addConverterFactory(SimpleXmlConverterFactory.create())
            .build();

和我的界面:

 public interface RestAPI {

    @GET("main_data1.gz")
    Call<Meritum> getData();

    @GET("terms1_EN.gz")
    Call<MeritumTerms> getTerms();

    @GET
    Call<GameResults> getResults(@Url String url);

}

所以我正在尝试获取那个 gzip 文件,但我总是得到这样的响应:

那么我需要添加什么才能让改造识别该 gzip 文件?

【问题讨论】:

  • 注:gzip的命名约定是在原扩展名terms1_EN.xml.gz后加.gz,这样原文件名不会丢失。
  • stackoverflow.com/questions/33889840/…的注解中的Accept-Encoding
  • 两个 cmets 都试过了,还不行
  • 您能否分享您尝试使用的返回 gzip 响应的 API 端点?

标签: java android retrofit


【解决方案1】:

您不应指定任何标题。

我构建了一个迷你服务器,它只响应以下压缩后的 XML:

<task>
    <id link="http://url-to-link.com/task-id">1</id>
    <title>Retrofit XML Converter Blog Post</title>
    <description>Write blog post: XML Converter with Retrofit</description>
    <language>de-de</language>
</task>

运行服务器后,我可以使用curl获取XML:

curl http://localhost:1337/ -v --compressed

我可以正确看到 XML 并且服务器以以下标头响应:

Content-Encoding: gzip
Content-Type: application/xml; charset=utf-8

知道服务器以压缩后的响应进行响应,现在我尝试使其在 Android 中工作:

我在build.gradle 中使用以下内容:

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile ('com.squareup.retrofit2:converter-simplexml:2.1.0') {
    exclude group: 'xpp3', module: 'xpp3'
    exclude group: 'stax', module: 'stax-api'
    exclude group: 'stax', module: 'stax'
}

这是改造实例配置:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(SimpleXmlConverterFactory.create())
            .build();

这是界面:

public interface MyApiEndpointInterface {
    @GET("/")
    Call<Task> getInfo();
}

这是我的Task 班级:

@Root(name = "task")
public class Task {
    @Element(name = "id")
    private long id;

    @Element(name = "title")
    private String title;

    @Element(name = "description")
    private String description;

    @Element(name = "language")
    private String language;

    @Override
    public String toString() {
        return "Task{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", description='" + description + '\'' +
                ", language='" + language + '\'' +
                '}';
    }
}

我可以通过执行以下操作来确认它是否正常工作:

call.enqueue(new Callback<Task>() {
            @Override
            public void onResponse(Call<Task> call, Response<Task> response) {
                if (response.isSuccessful()) {
                    Log.d("MainActivity", response.body() + "");
                    ...

【讨论】:

  • 这样尝试了很多次,但没有成功。顺便说一句,您没有在此处指定要下载的 .gz 文件的界面。检查下面对我有用的答案
【解决方案2】:

如果其他人有这个问题,他可以参考下面对我有用的链接

Retrofit: how to parse GZIP'd response without Content-Encoding: gzip header

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2016-10-11
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多