改造调用 BASE_URL 的根 url 而不是完整的 BASE_URL
Retrofit Calling Root url of BASE_URL instead of full BASE_URL
每当我使用改造调用带有端点 /user/block
的 API 时,改造调用 API 与根 Url 的 BASE_URL
而不是完整的 BASE_URL
.
就像我的 BASE_URL 一样。
BASE_URL = "http://111.111.111.11/SocialApi/public/";
那么 API 调用应该继续 BASE_URL+endPoint
,但是 Api 调用是在基础 Url、
的根上进行的
http://111.111.111.11/user/block
因此得到 404 Not Found 响应。
我到底做错了什么?
我的单身人士class,ApiClient.java
.
package com.socialcodia.famblah.api;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.socialcodia.famblah.SocialCodia;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
private static final String BASE_URL = "http://111.111.111.11/SocialApiFriendsSystemVideoThumb/public/";
public static final String HEADER_CACHE_CONTROL = "Cache-Control";
public static final String HEADER_PRAGMA = "Pragma";
private static final String TAG = "ServiceGenerator";
private static ApiClient mInstance;
private Retrofit retrofit;
public static final long CACHE_SIZE = 5 * 1024 * 1024;
private ApiClient()
{
Gson gson = new GsonBuilder()
.setLenient()
.create();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
private static OkHttpClient okHttpClient(){
return new OkHttpClient.Builder()
.cache(cache())
.addInterceptor(httpLoggingInterceptor())
.addNetworkInterceptor(networkInterceptor())
.addInterceptor(offlineInterceptor())
.build();
}
private static Cache cache()
{
return new Cache(new File(SocialCodia.getInstance().getCacheDir(),"socialcodia"),CACHE_SIZE);
}
private static HttpLoggingInterceptor httpLoggingInterceptor()
{
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.d("mufazmi",message);
}
});
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return httpLoggingInterceptor;
}
private static Interceptor networkInterceptor()
{
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response =chain.proceed(chain.request());
CacheControl cacheControl = new CacheControl.Builder()
.maxAge(20, TimeUnit.SECONDS)
.build();
return response.newBuilder()
.removeHeader(HEADER_PRAGMA)
.removeHeader(HEADER_CACHE_CONTROL)
.header(HEADER_CACHE_CONTROL,cacheControl.toString())
.build();
}
};
}
public static Interceptor offlineInterceptor()
{
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!SocialCodia.isNetworkOk())
{
CacheControl cacheControl = new CacheControl.Builder()
.maxStale(7,TimeUnit.DAYS)
.build();
request = request.newBuilder()
.removeHeader(HEADER_PRAGMA)
.removeHeader(HEADER_CACHE_CONTROL)
.cacheControl(cacheControl)
.build();
}
return chain.proceed(request);
}
};
}
public static synchronized ApiClient getInstance()
{
if (mInstance == null)
{
mInstance = new ApiClient();
}
return mInstance;
}
public Api getApi()
{
return retrofit.create(Api.class);
}
}
我的API界面。
package com.socialcodia.famblah.api;
import com.socialcodia.famblah.pojo.ResponseDefault;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Header;
import retrofit2.http.POST;
import static com.socialcodia.famblah.storage.Constants.USER_TOKEN;
import static com.socialcodia.famblah.storage.Constants.USER_ID;
public interface Api
{
@FormUrlEncoded
@POST("/user/block")
Call<ResponseDefault> doBlock(
@Header(USER_TOKEN) String token,
@Field(USER_ID) int userId
);
@FormUrlEncoded
@POST("acceptFriendRequest")
Call<ResponseDefault> acceptFriendRequest(
@Header(USER_TOKEN) String token,
@Field(USER_ID) int userId
);
}
从 ProfileActivity
调用 api 的方法
private void doBlock()
{
Call<ResponseDefault> call = ApiClient.getInstance().getApi().doBlock(token,hisUserId);
call.enqueue(new Callback<ResponseDefault>() {
@Override
public void onResponse(Call<ResponseDefault> call, Response<ResponseDefault> response) {
if (response.isSuccessful())
{
ResponseDefault responseDefault = response.body();
Toast.makeText(ProfileActivity.this, responseDefault.getMessage(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseDefault> call, Throwable t) {
Toast.makeText(ProfileActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
t.printStackTrace();
}
});
}
但是当我调用 acceptFriendRequest()
方法时它起作用了。意味着它调用 API.
接受好友请求的方法。
private void acceptFriendRequest()
{
if (Utils.isNetworkAvailable(getApplicationContext()))
{
btnAcceptFriendRequest.setEnabled(false);
Call<ResponseDefault> call = ApiClient.getInstance().getApi().acceptFriendRequest(token,hisUserId);
call.enqueue(new Callback<ResponseDefault>() {
@Override
public void onResponse(Call<ResponseDefault> call, Response<ResponseDefault> response) {
if (response.isSuccessful())
{
ResponseDefault responseDefault = response.body();
if (!responseDefault.getError())
{
btnAcceptFriendRequest.setEnabled(true);
btnRejectFriendRequest.setVisibility(View.GONE);
btnAcceptFriendRequest.setVisibility(View.GONE);
btnUnFriend.setVisibility(View.VISIBLE);
}
else
{
btnAcceptFriendRequest.setEnabled(true);
Toast.makeText(ProfileActivity.this, responseDefault.getMessage(), Toast.LENGTH_SHORT).show();
}
}
else
{
btnAcceptFriendRequest.setEnabled(true);
Toast.makeText(ProfileActivity.this, R.string.SNR, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseDefault> call, Throwable t) {
btnAcceptFriendRequest.setEnabled(true);
t.printStackTrace();
}
});
}
}
我已经通过从端点中删除斜杠解决了这个问题 /user/block
@FormUrlEncoded
@POST("user/block")
Call<ResponseDefault> doBlock(
@Header(USER_TOKEN) String token,
@Field(USER_ID) int userId
);
每当我使用改造调用带有端点 /user/block
的 API 时,改造调用 API 与根 Url 的 BASE_URL
而不是完整的 BASE_URL
.
就像我的 BASE_URL 一样。
BASE_URL = "http://111.111.111.11/SocialApi/public/";
那么 API 调用应该继续 BASE_URL+endPoint
,但是 Api 调用是在基础 Url、
http://111.111.111.11/user/block
因此得到 404 Not Found 响应。
我到底做错了什么?
我的单身人士class,ApiClient.java
.
package com.socialcodia.famblah.api;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.socialcodia.famblah.SocialCodia;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
private static final String BASE_URL = "http://111.111.111.11/SocialApiFriendsSystemVideoThumb/public/";
public static final String HEADER_CACHE_CONTROL = "Cache-Control";
public static final String HEADER_PRAGMA = "Pragma";
private static final String TAG = "ServiceGenerator";
private static ApiClient mInstance;
private Retrofit retrofit;
public static final long CACHE_SIZE = 5 * 1024 * 1024;
private ApiClient()
{
Gson gson = new GsonBuilder()
.setLenient()
.create();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
private static OkHttpClient okHttpClient(){
return new OkHttpClient.Builder()
.cache(cache())
.addInterceptor(httpLoggingInterceptor())
.addNetworkInterceptor(networkInterceptor())
.addInterceptor(offlineInterceptor())
.build();
}
private static Cache cache()
{
return new Cache(new File(SocialCodia.getInstance().getCacheDir(),"socialcodia"),CACHE_SIZE);
}
private static HttpLoggingInterceptor httpLoggingInterceptor()
{
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.d("mufazmi",message);
}
});
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return httpLoggingInterceptor;
}
private static Interceptor networkInterceptor()
{
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response =chain.proceed(chain.request());
CacheControl cacheControl = new CacheControl.Builder()
.maxAge(20, TimeUnit.SECONDS)
.build();
return response.newBuilder()
.removeHeader(HEADER_PRAGMA)
.removeHeader(HEADER_CACHE_CONTROL)
.header(HEADER_CACHE_CONTROL,cacheControl.toString())
.build();
}
};
}
public static Interceptor offlineInterceptor()
{
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!SocialCodia.isNetworkOk())
{
CacheControl cacheControl = new CacheControl.Builder()
.maxStale(7,TimeUnit.DAYS)
.build();
request = request.newBuilder()
.removeHeader(HEADER_PRAGMA)
.removeHeader(HEADER_CACHE_CONTROL)
.cacheControl(cacheControl)
.build();
}
return chain.proceed(request);
}
};
}
public static synchronized ApiClient getInstance()
{
if (mInstance == null)
{
mInstance = new ApiClient();
}
return mInstance;
}
public Api getApi()
{
return retrofit.create(Api.class);
}
}
我的API界面。
package com.socialcodia.famblah.api;
import com.socialcodia.famblah.pojo.ResponseDefault;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Header;
import retrofit2.http.POST;
import static com.socialcodia.famblah.storage.Constants.USER_TOKEN;
import static com.socialcodia.famblah.storage.Constants.USER_ID;
public interface Api
{
@FormUrlEncoded
@POST("/user/block")
Call<ResponseDefault> doBlock(
@Header(USER_TOKEN) String token,
@Field(USER_ID) int userId
);
@FormUrlEncoded
@POST("acceptFriendRequest")
Call<ResponseDefault> acceptFriendRequest(
@Header(USER_TOKEN) String token,
@Field(USER_ID) int userId
);
}
从 ProfileActivity
调用 api 的方法private void doBlock()
{
Call<ResponseDefault> call = ApiClient.getInstance().getApi().doBlock(token,hisUserId);
call.enqueue(new Callback<ResponseDefault>() {
@Override
public void onResponse(Call<ResponseDefault> call, Response<ResponseDefault> response) {
if (response.isSuccessful())
{
ResponseDefault responseDefault = response.body();
Toast.makeText(ProfileActivity.this, responseDefault.getMessage(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseDefault> call, Throwable t) {
Toast.makeText(ProfileActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
t.printStackTrace();
}
});
}
但是当我调用 acceptFriendRequest()
方法时它起作用了。意味着它调用 API.
接受好友请求的方法。
private void acceptFriendRequest()
{
if (Utils.isNetworkAvailable(getApplicationContext()))
{
btnAcceptFriendRequest.setEnabled(false);
Call<ResponseDefault> call = ApiClient.getInstance().getApi().acceptFriendRequest(token,hisUserId);
call.enqueue(new Callback<ResponseDefault>() {
@Override
public void onResponse(Call<ResponseDefault> call, Response<ResponseDefault> response) {
if (response.isSuccessful())
{
ResponseDefault responseDefault = response.body();
if (!responseDefault.getError())
{
btnAcceptFriendRequest.setEnabled(true);
btnRejectFriendRequest.setVisibility(View.GONE);
btnAcceptFriendRequest.setVisibility(View.GONE);
btnUnFriend.setVisibility(View.VISIBLE);
}
else
{
btnAcceptFriendRequest.setEnabled(true);
Toast.makeText(ProfileActivity.this, responseDefault.getMessage(), Toast.LENGTH_SHORT).show();
}
}
else
{
btnAcceptFriendRequest.setEnabled(true);
Toast.makeText(ProfileActivity.this, R.string.SNR, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseDefault> call, Throwable t) {
btnAcceptFriendRequest.setEnabled(true);
t.printStackTrace();
}
});
}
}
我已经通过从端点中删除斜杠解决了这个问题 /user/block
@FormUrlEncoded
@POST("user/block")
Call<ResponseDefault> doBlock(
@Header(USER_TOKEN) String token,
@Field(USER_ID) int userId
);