retrofit
を使用してWebサイトのHTMLを取得するにはどうすればよいですか?
たとえば、私はこれを持っています rl そして私はこのURLのhtmlを取得する必要があり、どうすればもっとロードできますか。
以下は私のコードです:
MainActivity.Java:
public class MainActivity extends AppCompatActivity {
TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView) findViewById(R.id.txt);
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.instagram.com/elde0596/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
final Interface_Web request = retrofit.create(Interface_Web.class);
Call<ResponseBody> call = request.getHtml();
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
txt.setText(response.body().source().toString());
Log.i("SDADASDAWEQ", "A " + response.body().toString());
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.i("SDADASDAWEQ", "B " + t.getMessage());
}
});
}
}
Interface_Web.Java:
public interface Interface_Web {
@GET("/")
Call<ResponseBody> getHtml();
}
見せてください:
[size=9500 text=<!DOCTYPE html>\n<!--[if lt IE 7]> <html lang="en" class="no…]
しかし、私はhtml
のすべてを見る必要があります。
私の問題を解決しました:
public class SecondClass extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.class_second);
Dispatcher dispatcher = new Dispatcher(Executors.newFixedThreadPool(20));
dispatcher.setMaxRequests(20);
dispatcher.setMaxRequestsPerHost(1);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.dispatcher(dispatcher)
.connectionPool(new ConnectionPool(100, 30, TimeUnit.SECONDS))
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(HttpUrl.parse("https://www.x.x/x/"))
.addConverterFactory(PageAdapter.FACTORY)
.build();
PageService requestAddress = retrofit.create(PageService.class);
Call<Page> pageCall = requestAddress.get(HttpUrl.parse("https://www.x.x/x/"));
pageCall.enqueue(new Callback<Page>() {
@Override
public void onResponse(Call<Page> call, Response<Page> response) {
Log.i("ADASDASDASD", response.body().content);
}
@Override
public void onFailure(Call<Page> call, Throwable t) {
}
});
}
static class Page {
String content;
Page(String content) {
this.content = content;
}
}
static final class PageAdapter implements Converter<ResponseBody, SecondClass.Page> {
static final Converter.Factory FACTORY = new Converter.Factory() {
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if (type == SecondClass.Page.class) return new SecondClass.PageAdapter();
return null;
}
};
@Override
public SecondClass.Page convert(ResponseBody responseBody) throws IOException {
Document document = Jsoup.parse(responseBody.string());
Element value = document.select("script").get(1);
String content = value.html();
return new SecondClass.Page(content);
}
}
interface PageService {
@GET
Call<SecondClass.Page> get(@Url HttpUrl url);
}
}
これはあなたを助けると思います。呼び出しオブジェクトをResponseBody
として作成すると、次のようなhtmlを取得できます。
Call<ResponseBody> call = Interface_Web.getJSONSignIn(...)
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
// access response code with response.code()
// access string of the response with response.body().string()
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
});