改造 - 子域和目录

Retrofit - subdomain and directory

对于我使用的服务器,我们有一个子域和一个目录,它们都绑定在一起。使用 Retrofit,您需要指定 baseURL,它似乎不允许目录。有什么办法可以实现吗?

示例:

我试过:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://dev.myserver.com/myserver_dev")
            .build();

...

@POST("user/login" )
Call<NewUser> login( @Query( "email" ) String email, @Query( "password" ) String password );

但它总是给我一个 404 说法 "Not Found"。它似乎只有在我这样做时才有效:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://dev.myserver.com")
            .build();

...

@POST("server_dev/user/login" )
Call<NewUser> login( @Query( "email" ) String email, @Query( "password" ) String password );

主要是我希望能够快速切换服务器,而不必手动编辑两个不同的字段。 (一个用于 baseUrl,一个用于目录。)

感谢您的宝贵时间。 :)

似乎改造会忽略 baseUrl 的路径部分,除非它以尾部斜杠结尾。

试试——

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://dev.myserver.com/myserver_dev/")
            .build();

顺便说一下,已经有一个关于此的问题提交了 -- https://github.com/square/retrofit/issues/1049

我建议你使用Dynamic Urls or Passing a Full Url

# Example 3 — completely different url
base url: http://futurestud.io/api/  
endpoint: https://api.futurestud.io/  
Result:   https://api.futurestud.io/

# Example 4 — Keep the base url’s scheme
base url: https://futurestud.io/api/  
endpoint: //api.futurestud.io/  
Result:   https://api.futurestud.io/

# Example 5 — Keep the base url’s scheme
base url: http://futurestud.io/api/  
endpoint: //api.github.com  
Result:   http://api.github.com  

你的情况:

String SCHEME = "https:";
String SERVER_URL= "//{subdomain}.myserver.com/myserver_dev/";
String BASE_URL= SCHEME + BASE_URL;
Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .build();

@POST(SERVER_URL + "user/login")
    Observable<NewUser> createNewUser(@Path("subdomain") String subdomain, @QueryMap HashMap<String, String> params);

致电:

HashMap<String, String> params = new HashMap<>();
     params.put("email",email);
     params.put("pass",pass);
Observable<NewUser>  observable = mApiService.createNewUser("dev",params);