Насколько я могу судить, происходит несколько вещей. Позвольте мне разбить его на куски.
Во-первых, вы путаете аннотацию @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")
.
Это основное различие между этими двумя аннотациями. Причина, по которой вы видите ноль в текстовом представлении, заключается в том, что имя атрибута вашей модели не соответствует 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())
. Модернизация будет форматировать название компании в путь, и вы бы назвали правильный URL.