Android рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП OData + RxJava + рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ 2

рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдирджреЗрдЦреА рдЕрдирджреЗрдЦреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдзреВрдореНрд░рдкрд╛рди рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ RxJava рдФрд░ Retrofit 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ - рдЖрдк рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдУрдбрд╛рдЯрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд░рд╛рдорджрд╛рдпрдХ рдЙрдкрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдХ рд╡реНрд╣рд╛рд░реНрдЯрди рдХрд╛

рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж ред

рдЬрд╛рджреВ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рдЬреЛ рдУрдбрдЯрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕реЗ рдЙрди рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдерд╛, рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред

рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдкрд░ рдкреНрд░рд▓реЗрдЦрди Odata рд╣реИрдВ Olingo рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд╕реА # рдореЗрдВ - рд╕реЗ рдЕрдкрд╛рдЪреЗ рдХреЗрд╡рд▓ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдУрдбрдЯрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, Microsoft рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ рдФрд░ рдореИрдВ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

рдпрд╣рд╛рдБ рд╡рд┐рдХреА Open_Data_Protocol рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рднрд╛рд╖рд╛ рджреА рдЧрдИ рд╣реИ

рдбреЗрдЯрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (OData) рдЦреЛрд▓реЗрдВ
Open Data Protocol (OData) тАФ - . , HTTP-, XML JSON.

4.0, OData тАФ , OASIS.

рдФрд░ рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдУрдбрдЯрд╛ REST API рдореЗрдВ рдПрдХ рддрд░рд╣ рдХрд╛ SQL рд╣реИ рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рд╣реИ рдФрд░ рдмрд┐рдирд╛ рдореЙрдбрд▓ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ - рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдПрдХ рдХрдард┐рди рдХрд╛рдо рд╣реИред

рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд╛рдирдХ рдФрд░ рдмрд╛рд░-рдмрд╛рд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХрд╣реВрдВрдЧрд╛, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЗрди рд▓рд┐рдВрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рд╡рд┐рд╖рдп рдкрд░ рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рд╣реИред

рдЕрдм рдЪрд▓реЛ рдЬрд╛рджреВ рдХрд░рддреЗ рд╣реИрдВ:

рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдВред

рд╣рдо рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ 2 рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдХреНрд╡рд╛рдпрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ ред

build.gradle рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ
// Network
    implementation 'com.squareup.retrofit2:retrofit:2.7.1' //   Retrofit 2
    implementation 'com.squareup.retrofit2:converter-gson:2.7.1' //     JSON 
    implementation 'com.squareup.okhttp3:logging-interceptor:4.3.1' //  
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.7.1' //     RxJava
    implementation 'com.squareup.okhttp3:okhttp:4.3.1' // OkHttp -  HTTP-
listing 1

рдпреЗ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдиреЗрдЯрд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИрдВред рдореИрдВ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ 2 рдХреЗ

рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдирд╣реАрдВ рджреЗрдЦрддрд╛, рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рдореИрдиреБрдЕрд▓ рд╣реИ: рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд░рд┐рдЯреНрд░реЛрдлрд┐рдЯ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред

NetworkService рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ:
public class NetworkService {

    private static final String TAG = "NetworkService";

    private static final NetworkService
            mInstance = new NetworkService();

    private String mToken;
    private Retrofit mRetrofit;

    public static NetworkService getInstance() {
        return mInstance;
    }

    private NetworkService() {

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

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

        OkHttpClient.Builder okHttpClient =
                new OkHttpClient.Builder()
                        .addInterceptor(interceptor)
                        .addInterceptor(chain -> {
                            Request newRequest =
                                    chain.request().newBuilder()
                                           .addHeader("Accept",
                                                     "application/json,text/plain,*/*")
                                           .addHeader("Content-Type",
                                                    "application/json;odata.metadata=minimal")
                                           .addHeader("Authorization", mToken)
                                    .build();

                            return chain.proceed(newRequest);
                        });

        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                .create();

        mRetrofit = new Retrofit.Builder()
                .baseUrl(Const.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(rxAdapter)
                .client(okHttpClient.build())
                .build();
    }
    public ApiService getNetworkClient(){
        return mRetrofit.create(ApiService.class);
    }
}

listing 2

рдПрдкреАрдЖрдИ рдмрдирд╛рдПрдВ:
public interface ApiService {
//    
@GET("odata/product")
Observable<List<ProductsDto>> getProducts();
}
listing 3

рдФрд░ рд╣рдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рддреЗ рд╣реИрдВ:
public class ProductsController {

    private ApiService mApiService;

    private List<ProductsDto> listProducts;
    private Gson gson;

    public ProductsController() {

        mApiService = App.getNetworkService().getNetworkClient();

        listProducts = new ArrayList<>();

        gson = new Gson();
    }

    public void productsBtnClick() {

        mApiService.getProducts()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new DisposableObserver<List<ProductsDto>>() {
                    @Override
                    public void onNext(List<ProductsDto> products) {

                        listProducts.addAll(listProducts);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                    }
                });
    }
listing 4

рддреЛ, рдкреЙрдбрдХреНрдЯ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рд╕рднреА рдбреЗрдЯрд╛ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ POJO рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореИрдВ HttpLoggingInterceptor рдореЗрдВ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрд╡рд░реЛрдзрди рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ - Level.BODYред

рд╣рдо рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪреА 4 рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрддреНрддрд░ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рдЧрднрдЧ рд╣реЛрдЧрд╛:

//         
//   JSON
{
  "@odata.context":"https://example.xxx/api/odata/$metadata","value":[
    {
      "name":"product","kind":"EntitySet","url":"product" //  
    },{
      "name":"blogs","kind":"EntitySet","url":"blogs"  // 
    },{
      "name":"posts","kind":"EntitySet","url":"posts"  // 
    },{
      "name":"comments","kind":"EntitySet","url":"comments" // 
    },{
      "name":"rates","kind":"EntitySet","url":"rates" // 
    }
  ]
}

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 5

рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдЧреЗ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдпрд╣реА рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рд╡рд╕реНрддреБ рд╣реИ, рдЕрдиреБрд░реЛрдз рдмрдирд╛рддреЗ рд╕рдордп рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд░реНрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдПрдХ рдирдпрд╛ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмреИрд╕рд╛рдЦреА рдХреЛ рдкреЗрдВрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рд╕рд╛рдзрди рдХреЗ рдЖрд░рд╛рдо рдХреЗ рдЪрд░рдореЛрддреНрдХрд░реНрд╖ рдФрд░ рдкрд┐рд▓реНрд▓рд╛ рдЦреБрд╢реА


рдФрд░ рдпрд╣рд╛рдБ рд╡рд╣ рдкрд▓ рд╕рдЪ рд╣реИ, рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ 2 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╢рдХреНрддрд┐, рд╢рдХреНрддрд┐ рдФрд░ рд╕рд╛рджрдЧреА ред рдЕрдм рдЖрдк рдУрдбрдЯрд╛ рд╕реЗрд╡рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :

//   properties  product
@GET("odata/product?$filter=Id eq 111&$expand=dateReading($orderby=Date desc")
Observable<List<ProductsDto>> getProducts();

//  properties  blogs
@GET("odata/blogs?$orderby=Date desc")
Observable<List<BlogsDto>> getBlogs();

//        
@GET("odata/product?$filter=((Id eq 19) and (Name eq 'Available')) and ((Status eq 'OPEN') or ((Status eq 'CLOSED') and (Date ge 2020-02-13T06:39:48Z)))&$orderby=Status asc,Date desc&$top=10&$expand=AuthorId,CategoryId($expand=weight)&$count=true")
Observable<List<ProductsDto>> getProducts();
//        ,
//       . 

// :
@GET
Observable<List<ProductsDto>> getProducts(@Url String url);

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6

рдпрд╣рд╛рдБ рдпрд╣ рд╕рд┐рд▓реБрд╢реНрдХрд╛ рд╡реАрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ 2 рд╣реИ ред рдбрд╛рдпрдиреЗрдорд┐рдХ Url рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЗрд╕ рд╕рднреА рджреНрд░рд╡реНрдпрдорд╛рди рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХреЛрдб рдореЗрдВ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рдХрд▓реНрдкрдирд╛ рд╣реИред

рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
private void buttonGetProduct() {
//     
        String one = "odata/product?$filter=Id eq ";
        String id = "777";
        String tree = "&$expand=dateReading($orderby=Date desc)";
        String url = one + id + tree;

        mApiService.getProduct(url)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new DisposableObserver<List<ProductDto>>() {
                    @Override
                    public void onNext(List<ProductDto> products) {

//       ,     JSON,
//         
                        mProductsDto.addAll(countersDtos);
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onComplete() {
                    }
                });
    }
listing 7

рд╕рд╛рд░рд╛рдВрд╢


рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЕрдиреБрднрд╡ рдерд╛, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдпрд╣ рд▓реЗрдЦ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣рдЯрд╛ рджреЗрдЧрд╛ред

рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ 2 рдФрд░ рдУрдбрд╛рдЯрд╛ рдкрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрдЧрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рддреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рд▓рд┐рдВрдХ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред

рдореИрдВ рдХреЛрдб рдХрд╛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЙрддреНрдкрд╛рдж рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╣реИред

рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓рд┐рдВрдХ:

тЖТ  Microsoft рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг: рдбреЗрдЯрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЦреЛрд▓реЗрдВ
тЖТ  рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ OData 4.0 рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА
тЖТ  рдУрдкрди рдбреЗрдЯрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ

All Articles