Использование модернизации для получения URL-адреса с разных относительных путей - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь получить 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

Редактировать: My textViewReslt возвращается 403

1 Ответ

0 голосов
/ 08 ноября 2018

Насколько я могу судить, происходит несколько вещей. Позвольте мне разбить его на куски.

Во-первых, вы путаете аннотацию @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.

...