2017-05-04 4 views
0

私はどこでも検索しましたが、私が見たチュートリアルはRetrofitが提供するマニュアルと一致しません。私はこれについての答えを見つけることができなかったので、これは愚かな質問であると思います。私はAndroidプログラミングではまったく新しいものです。Retrofitインスタンスを作成するクラスはどれですか?

私はCodepath's guideを以下だし、それは言う部分でいます:

To send out network requests to an API, we need to use the [Retrofit 
builder] class and specify the base URL for the service. 

// Trailing slash is needed 
public static final String BASE_URL = "http://api.myservice.com/"; 
Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(BASE_URL) 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build(); 

レトロフィットインスタンスを作成する私はこれを置くために、クラス見当がつかないまたは私は新しいを作成するのです。それのためのクラス?

答えて

2

ジョナサンあなたに喜んだあなたの質問は、より多くのエントリーレベルであると思います。「どうすれば使用できますか?」質問、そう?

基本的に、投稿したコードはRetrofitインスタンスを作成します。これは、APIインターフェイスオブジェクトを作成できるオブジェクトです。 1つのRetrofitオブジェクトが1つのベースURLを処理します。

interfaceを作成して、apiエンドポイントと期待される応答を定義します。ウェブサイトからの例を使用する:

エンドポイントインタフェース

public interface GitHubService { 
    @GET("users/{user}/repos") 
    Call<List<Repo>> listRepos(@Path("user") String user); 
} 

次に、作成したレトロフィットインスタンスを使用して、あなたは

GitHubService service = retrofit.create(GitHubService.class); 

を呼び出すことで、このインタフェースの実装をインスタンス化し、単純にリクエストを送信することができます呼び出してAPIに転送

Call<List<Repo>> repos = service.listRepos("octocat"); 
repos.enqueue(callback) //add a callback where you can handle the response 

JonathanはRxJavaコールアダプタを使用していますが、今はその部分をスキップして自分で簡単にする必要があります。

EDIT:コメントでリクエストされた例を追加します。このAPIエンドポイントの

- > https://api.textgears.com/check.php?text=I+is+an+engeneer!&key=DEMO_KEY

は、あなたが最も確かにすべての要求にAPIKEYを追加する必要があるとして、これも興味深いケースである

@GET("check.php") 
Call<YourResponseClass> performCheck(@Query("text") String text, @Query("key") apiKey); 

必要です。しかし、毎回パラメータとして手動で追加するのは良い方法ではありません。解決策があります - Interceptor

public class ApiKeyRequestInterceptor implements Interceptor { 

@Override 
public Response intercept(Chain chain) throws IOException { 
    Request request = chain.request(); 
    final HttpUrl newUrl = request.url().newBuilder() 
      .addQueryParameter(Constants.API.PARAM_API_KEY, BuildConfig.NEWS_API_KEY) //add your api key here 
      .build(); 
    return chain.proceed(request.newBuilder() 
      .url(newUrl) 
      .build()); 
} 
} 

、あなたのキーのために余分なフィールドを必要としない、とあなたは

にあなたの方法を減らすことができます( OkHttpClientを構築)、それを使用するには、この場合には

OkHttpClient client = new OkHttpClient.Builder() 
      .addInterceptor(new ApiKeyRequestInterceptor()) 
      .build(); 

Retrofit = new Retrofit.Builder() 
      .baseUrl(Constants.API.BASE_URL) 
      .client(client) 
      .build(); 

をレトロフィットを伝えます

Call<YourResponseClass> performCheck(@Query("text") String text); 
+0

あなたは正しい人です、Rxは一歩ですが、それについて知り、学ぶことができて、素早くRxで対応する方が簡単です –

+0

もちろん私はすべてのプロジェクトでRxを使用しますが、まだ別のものですから、一度に1つのレンガを追加させてください:) – LukeJanyga

+0

彼女:)しかし、この説明は非常に役に立ちました! – Ang

1

コントローラを作成して、要求を処理できます。あなたのRequestControllerへのアクセスに続いて

public class MyApplication extends Application { 
... 
public static RequestController requestController; 
... 
@Override 
public void onCreate() { 
    super.onCreate(); 
    requestController = RequestController.getInstance(this); 
    ... 
} 
    public static FPDApplication getInstance() { 
    if (instance == null) { 
     instance = new FPDApplication(); 
    } 
    return instance; 
} 

} 

だけフォローを行います:

public class RequestController { 

private final static String BASE_URL_CLUB = "url"; 
private static RequestApiEndpoints apiServiceAsync; 
private static RequestController instance; 
private static final int TIMEOUT_MILLIS = 10000; 
private static final TimeUnit TIMEOUT_UNIT = TimeUnit.MILLISECONDS; 
private Context context; 

private RequestController(Context context) { 

    this.context = context; 

    RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()); 

    Retrofit retrofitAsync = new Retrofit.Builder() 
      .baseUrl(BASE_URL_CLUB) 
      .client(createDefaultOkHttpClient()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(rxAdapter) 
      .build(); 

    apiServiceAsync = retrofitAsync.create(RequestApiEndpoints.class); 
} 


private OkHttpClient createDefaultOkHttpClient() { 
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

    return new OkHttpClient().newBuilder() 
      .cache(new Cache(context.getCacheDir(), 10 * 1024 * 1024)) // 10 MB 
      .addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
        Request request = chain.request(); 
        if (Utils.hasInternet(context)) { 
         request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build(); 
        } else { 
         request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24).build(); 
        } 
        return chain.proceed(request); 
       } 
      }) 
      .connectTimeout(TIMEOUT_MILLIS, TIMEOUT_UNIT) 
      .readTimeout(TIMEOUT_MILLIS, TIMEOUT_UNIT) 
      .writeTimeout(TIMEOUT_MILLIS, TIMEOUT_UNIT) 
      .addInterceptor(interceptor) 
      .build(); 
} 

public static RequestController getInstance(Context context) { 
    if (instance == null) { 
     instance = new RequestController(context); 
    } 
    return instance; 
} 
public Observable<ResponseObject> getExampleInfo(String param) { 
    return apiServiceAsync.getExampleInfo(param).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); 
} 
} 

次に、あなたのインターフェース:次に

public interface RequestApiEndpoints { 

@GET("path/to/request") //without the base url 
Observable<ResponseObject> getExampleInfo(@Query("param") String param); 
} 

あなたのApplicationクラスの

MyApplication.requestController.getExampleInfo(string); 
+0

ありがとうございます!私はこれを私のコードに今追加する方法を理解していると思う – Ang

関連する問題