使用改造从不同的相对路径获取网址

时间:2018-11-08 16:07:37

标签: android json dynamic gson retrofit2

我试图为每个客户的站点获取CompanyEndpoint,但是我对在界面上使用改造感到困惑。

这是我到目前为止所拥有的:

CompanyName : "company1"
CompanyEndpoint : "https://example.com"
IdentityEndpoint : "https://example.com/identity"
AppLoginMode : "Anonymous"

AppRouterApi.java

public interface AppRouterApi {

    @GET("api/sites/{CompanyName}")
    Call<Company> getCompanyName (@Url  String companyName);


}

Company.java

public class Company {

    String Endpoint;

    public String getEndpoint() {
        return endpoint;
    }
}

MainActivity.java

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://example.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        appRouterApi = retrofit.create(AppRouterApi.class);


        getCompany();


    }

    private void getCompany(){
        retrofit2.Call<Company> companyRequest = appRouterApi.getCompanyName(); //Error here saying a string cant be applied to ()
        companyRequest.enqueue(new retrofit2.Callback<Company>() {
            @Override
            public void onResponse(retrofit2.Call<Company> call, retrofit2.Response<Company> response) {

                if(!response.isSuccessful()){
                    textViewResult.setText("Code:" + response.code());
                    return;
                }

                Company company = response.body();
                String content = "";
                content += "Url" + company.getEndpoint();
                textViewResult.setText(content);


            }

            @Override
            public void onFailure(retrofit2.Call<Company> call, Throwable t) {

            }
        });
    }

https://example/sites/ {companyName}

因此,如果我搜索: https://example/sites/company1

JSON将具有一个对象,我需要获取端点URL值,该值将为:https://company1.com

编辑:我的textViewReslt返回403

1 个答案:

答案 0 :(得分:0)

据我所知,有几件事正在发生。让我把它分成几块。

第一件事是您将注释@Path与注释@Url混淆了。他们有不同的目的。

要在@Path之类的批注中将路径的一部分格式格式化为url,请使用@GET

public interface AppRouterApi {
  @GET("api/sites/{CompanyName}")
  Call<Company> getCompanyName (@Path("CompanyName")  String companyName);
}

此接口将格式化作为路径一部分传递给getCompanyName的参数。呼叫getCompanyName("foo")将呼叫端点"https://example.com/api/sites/foo"

当您只想调用该URL时,可以使用@Url。在这种情况下,只用http方法注释接口方法。例如,

public interface AppRouterApi {
  @GET
  Call<Company> getCompanyName (@Url String url);
}

然后,您将必须使用整个URL来调用该方法。要调用与之前相同的网址,您必须调用getCompanyName("https://example.com/api/sites/foo")

这是这两个注释之间用法的主要区别。之所以在文本视图中看到null是因为模型的属性名称与json不匹配。您有2个选择。

首先,您可以将模型更改为:

public class Company {

   String CompanyEndpoint;

   public String getEndpoint() {
     return endpoint;
   }
}

CompanyEndpoint与json中的名称完全相同。另一种方法是告诉json序列化器要使用的名称。由于您使用的是gson,因此可以像这样使用@SerializedName

public class Company {

   @SerializedName("CompanyEndpoint")
   String Endpoint;

   public String getEndpoint() {
     return endpoint;
   }
}

@SerializedName("CompanyEndpoint")告诉gson在序列化和反序列化时使用哪个名称。

本质上,您有2个选择。您可以使用端点或公司名称。如果您不希望域发生变化,建议您将第一种方法与@Path批注一起使用。这是通常使用Retrofit进行的工作,而且我个人认为,与传递URL相比,它更容易处理。我的建议是,使用类似以下的模型:

public class Company {

   @SerializedName("CompanyName")
   String name;

   public String getName() {
     return name;
   }
}

这将使您可以访问公司的名称属性并致电getCompanyName(company.getName())。改造会将公司名称格式化为路径,然后您将调用正确的网址。