使用Retrofit获取Html响应

时间:2015-07-18 23:50:08

标签: retrofit

我是Retrofit的新手。我向网站发出POST请求。网站以HTML格式返回响应。所以我会解析它。但是,Retrofit尝试将其解析为JSON。怎么办?

User

我应该使用回叫吗?

2 个答案:

答案 0 :(得分:5)

Retrofit使用converter来处理来自端点和请求的响应。默认情况下,Retrofit使用GsonConverter,它使用gson库编码对Java对象的JSON响应。在构建Retrofit实例时,您可以覆盖它以提供自己的转换器。

您需要实现的界面here(github.com)。这里也是一个简短的教程,虽然使用杰克逊库,许多位仍然相关:futurestud.io/blog

另请注意,转换器可以双向工作,转换请求和响应。由于您只希望在一个方向上进行HTML解析,因此您可能希望在自定义转换器中使用GsonConverter,以便在toBody方法中将传出的Java对象转换为JSON。

答案 1 :(得分:0)

可能不是最好的解决方案,但这是我如何通过改造获得html页面的来源:

MainActivity.java

ApiInterface apiService = ApiClient.getClient(context).create(ApiInterface.class);

//Because synchrone in the main thread, i don't respect myself :p
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

//Execution of the call
Call<ResponseBody> call = apiService.url();
response = call.execute();

//Decode the response text/html (gzip encoded)
ByteArrayInputStream bais = new ByteArrayInputStream(((ResponseBody)response.body()).bytes());
GZIPInputStream gzis = new GZIPInputStream(bais);
InputStreamReader reader = new InputStreamReader(gzis);
BufferedReader in = new BufferedReader(reader);

String readed;
while ((readed = in.readLine()) != null) {
      System.out.println(readed); //Log the result
}

ApiInterface.java

@GET("/")
Call<ResponseBody> url();

ApiClient.java

public static final String BASE_URL = "https://www.google.com";

private static Retrofit retrofit = null;

public static Retrofit getClient(Context context) {
    if (retrofit==null) {

        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .build();

        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(ScalarsConverterFactory.create())
                .client(okHttpClient)
                .build();
    }
    return retrofit;
}