Android - 在应用客户端

时间:2016-03-01 15:12:40

标签: android server endpoint spring-android

我有以下服务器网址:

  

服务器碱基URL /方法1
  服务器碱基URL /方法2
  服务器碱基URL /方法3   
... ...   服务器碱基URL / method100

我目前正在使用属性文件来存储网址。当我需要使用一些服务器URL时,我会阅读属性文件并使用Spring 4 Android执行http请求

我知道这应该是另一种方式(并且更好的方式)来做到这一点。实现这一目标的最佳做法是什么?

4 个答案:

答案 0 :(得分:3)

我肯定会将值下的android资源作为字符串。所以你给它命名一次并从Android工作室获得功能强大的工具,通过Locale,buildtype和flavors进行定制和本地化......我只是建议在分隔文件中设置url。即urls.xml

    <resources>
        <string name="url_server1">http://apipas.com/gloabl/server1</string>
        <string name="url_server2">http://apipas.com/global/server2</string>
    </resources>

对于简单的项目,它可能无关紧要..但是当您处理企业,或多个目标,多语言,不同的服务器层(基于位置;欧盟/亚洲......,或使用时:免费/付费,或阶段:开发/测试/生产)选择管理资源的方式至关重要。

让我详细说明......让我们说这个build.gradle for app:

buildTypes {
    debug {
        debuggable false
        applicationIdSuffix 'debug'
    }
    qa {
        debuggable false
        applicationIdSuffix 'qa'
    }
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

productFlavors {
    paid {
        applicationId = "com.apipas.android.wellmanagerurlsapp.paid"
    }
    free {
        applicationId = "com.apipas.android.wellmanagerurlsapp.free"
    }
}

此外,它支持 de 作为德语和澳大利亚语言环境

所以我们有这些自定义因素:

  • 风味:付费/免费(可能是别的东西:CPU拱,地区等......)
  • BuildType:除了发布和调试之外,我还使用测试服务器(如果可用)将QA添加到测试应用中。
  • 语言环境:base,de,&amp;烯RAU

您需要做的就是在正确的位置覆盖资源,以实现您需要实现的目标

假设我要使用buildType base来自定义URL:

enter image description here

或者你使用Flavors:

enter image description here

在使用flavor和buildType一起定制res时,请注意不要重复。

在开发过程中,您不需要更改URL的名称..当您拥有大型项目时,这真的是一个好点。您仍然可以轻松地为任何flavor / buildType / locale

更改内容

您还可以使用所引用的JSON,XML或属性。但他们都不会给你什么res。

祝你好运,'。

答案 1 :(得分:1)

另一种选择是使用Plain Java:

public class ServerInfo {
     private static final String URL_BASE_DEBUG = "your base debug url";
     private static final String URL_BASE_RELEASE = "your base release url";

     public static String getBaseUrl() {
          //change if debug' release or whichever flavor
          return URL_BASE_DEBUG;
     } 
}

非常简单......您可以在一个Java Class

中获得所需的所有信息

现在关于网络通信它真的取决于你...有很多选择......我个人喜欢Retrofit 2,它是网络库okhttp

之上的包装器

如何在上述方法中使用Retrofit的简短示例是:

休息Api(如User Rest api)

public interface SomeRestApiEndPoints {
    @GET("api/method1")
    Call<ReturnValue> method1(params);

    @POST(api/method2)
    Call<ReturnObject> method2(params);
    ...
}

Rest客户端

public class RestClient {
   private static RestClient sRestClient;

   private Retrofit mRetrofit;
   private SomeRestApiEndPoints apiEndpoint;

   public static RestClient getRestClient () {
        if(sRestClient != null){
            return sRestClient;
        }

        synchronized (RestClient.class) {
            if(sRestClient == null) {
            //gson example
            Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
            RestClient client = new RestClient();
            client.mRetrofit = new Retrofit.Builder()
                    .baseUrl(ServerInfo.getBaseUrl()) //This is where you bind the base Url
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();     

            client.apiEndpoint = client.mRetrofit.create(SomeRestApiEndPoints.class);
            sRestClient = client;
        }
        return sRestClient;
    }


    public SomeRestApiEndPoints getApi() {
        return apiEndpoints;
    }

}

使用示例

Call<ReturnValue> call = RestClient.getRestClient().getApi().method1(params);

答案 2 :(得分:1)

我用来做的是根据buildType在<tbody> <tr ng-repeat="u in usrs.usersList track by u.id"> <td class="td-name">{{ u.firstname }} {{ u.lastname }}</td> <td class="sort-email">{{ u.username }}</td> <td class="sort-login">{{ u.session.formatted_date }}</td> <td class="sort-role">{{ u.role_id }}</td> <td><button class="btn-green-sm">Remove</button></td> </tr> <tr> <td>{{usrs.usersList}}</td> </tr> </tbody> 文件中创建URL参数。这是伟大的iosched项目遵循的策略。

要做的第一件事是在您的build.gradle文件中添加您的行:

gradle.propeties

之后在# Website hostname dev_website_host_name = devUrl.com production_website_host_name = productionUrl.com 文件中,例如:

build.gradle

Grade将创建名为buildTypes { debug { debuggable true minifyEnabled false signingConfig signingConfigs.debug resValue("string", "website_host_name", "${dev_website_host_name}") } release { debuggable false minifyEnabled true // No signing config as we do this separately. proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt') resValue("string", "website_host_name", "${production_website_host_name}") } } 的字符串资源,并且根据您的构建类型将具有一个值或另一个值。要通过代码访问该值,只需键入website_host_name即可!

这是我处理不同环境的不同构建类型的方法。谷歌的项目始终是一个很好的参考。

答案 3 :(得分:0)

更好的方法是使用REST API客户端。我会建议您使用Retrofit

可以找到here找到如何使用它的正确指南。