我试图为每个客户的站点获取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
答案 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())
。改造会将公司名称格式化为路径,然后您将调用正确的网址。