android - 使用改造从不同的相对路径获取 url
问题描述
我正在尝试为每个客户的站点获取 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);
}
公司.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
解决方案
据我所知,有几件事正在发生。让我把它分成几块。
首先是您将 annotation@Path
与 annotation混淆了@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 调用该方法。要调用与以前相同的 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
在序列化和反序列化时使用哪个名称。
本质上,您有两个选择。您可以使用端点或公司名称。如果您不希望域发生变化,我建议您使用带有@Path
注释的第一种方法。这就是 Retrofit 通常会做的事情,就个人而言,我认为它比传递 url 更容易处理。我的建议是,使用如下模型:
public class Company {
@SerializedName("CompanyName")
String name;
public String getName() {
return name;
}
}
这将允许您访问公司的 name 属性并调用getCompanyName(company.getName())
. Retrofit 会将公司名称格式化到路径中,然后您将调用正确的 url。
推荐阅读
- java - @KafkaListner - 跳过旧消息,也就是只接收新消息
- django - 我必须将我的 Django 中间件放在哪里进行缓存?
- java - JAVA - JSON 将枚举列表序列化为类
- flutter - 发布构建失败颤动
- vba - 如何密件发送到我域之外的电子邮件地址的任何电子邮件?
- c# - 通过 DocuSign 集成 SSRS 报告以具有电子签名能力
- python - 比较两个系列时,如何根据一个系列进行过滤?
- aws-lambda - Apollo Server Lambda 性能缓慢
- oracle - 休眠查询将逗号分隔的字符串与列表进行比较
- android - 点之间的 ArcGISRuntime 箭头