我是Retrofit的新手。我向网站发出POST请求。网站以HTML格式返回响应。所以我会解析它。但是,Retrofit尝试将其解析为JSON。怎么办?
User
我应该使用回叫吗?
答案 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;
}