我正在Android应用程序中尝试Retrofit 2.4.0。我在哪里有登录活动。我正在尝试POST请求,但它在onResponse方法中返回了响应代码404。但是它与POSTMAN完美配合,并且我使用HttpLoggingInterceptor
在日志中获取了正确的数据。我尝试了许多方法来克服此问题。我的服务代码是。
@POST("user_login")
@FormUrlEncoded
Call<ResponseBody> user_login(@Field("email") String email, @Field("password") String password);
@Multipart
@POST("user_login")
Call<ResponseBody> user_login(@PartMap() Map<String, RequestBody> bodyMap);
@Multipart
@POST("user_login")
Call<Status> user_login(@Part("email") RequestBody email, @Part("password") RequestBody password);
@POST("user_login")
Call<JSONObject> user_login(@Body String credentials);
@POST("user_login")
Call<User> user_login(@Body LoginCredentials credentials);
以上方法均无效。
我正在发布一些我正在使用的其他方法。
@Provides
@Singleton
Cache provideOkHttpCache(TUK application) {
int cacheSize = 10 * 1024 * 1024; // 10 MB
return new Cache(application.getCacheDir(), cacheSize);
}
@Provides
@Singleton
Gson provideGson() {
GsonBuilder builder = new GsonBuilder();
// builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
return builder.create();
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cache(cache);
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> Logger.wtf("AppModule", message));
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(interceptor);
return builder.build();
}
@Provides
@Singleton
Retrofit provideRetrofit(Gson gson, OkHttpClient client) {
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl(TUK.BASE_URL)
.client(client)
.build();
}
但是我也在尝试使用GET方法的其他URL正常运行。
我的基本网址就像"http://www.example.com/api/"
而我的@PartMap()
代码是
public static Map<String, RequestBody> getMap(LoginCredentials credentials) {
Map<String, RequestBody> map = new HashMap<>();
map.put("email", RequestBody.create(MultipartBody.FORM, credentials.getEmail()));
map.put("password", RequestBody.create(MultipartBody.FORM, credentials.getPassword()));
return map;
}
我的HttpLoggingInterceptor
记录数据是
<-- 404 https://www.example.com/api/user_login (718ms)
content-type: application/json; charset=utf-8
.
.
.
.
{"status":false,"message":"Invalid User Email Or Password."}
<-- END HTTP (60-byte body)
和我的onResponse
方法记录数据的是
Response{protocol=h2, code=404, message=, url=https://www.example.com/api/user_login}
最后,我的问题是如何使用翻新发布数据。
我已经坚持到这一点了。我已经尝试了其他从stackoverflow解决方案,但没有帮助。请大家帮我解决这个问题。任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
您无需将多部分主体用于POST请求,并且可以通过以下方式轻松完成 下面的代码。例如,我有一个基本网址,例如http://example.com/api/
@FormUrlEncoded
@POST("login")
Call<LoginResponse> login(@Field("email") String email,
@Field("password") String password);
在上述情况下,最终通话将被重定向到http://example.com/api/login。
因此,在这种情况下,我的电话将定向到http://example.com/api/login。 或其他问题可能出在您的URL中。由于您的基本网址是这个“ http://www.example.com/api/”,并且通过加入该API名称的API,它变成了这个“ http://www.example.com/api//api/user_login”,其中包含两个“ //”,因此可能会导致找不到您的API它会抛出404(未找到)。因此,请相应地调整您的基本网址。希望能有所帮助。
答案 1 :(得分:0)
看起来像服务器错误,404是服务器返回的错误代码。改造要求成功。但是,任何返回码不是200的请求都将被视为失败请求。改装将回调onFailure()
方法,您可以通过以下方式获得响应。
@Override
public void onFailure(Call<News> call, Throwable t) {
if(t instanceof HttpException){
ResponseBody body=((HttpException) t).response().errorBody();
}
}
告诉您后端404的含义,此处不应返回
答案 2 :(得分:0)
我已经通过设置builder.setLenient();
解决了这个问题
完整的代码是
@Provides
@Singleton
Gson provideGson() {
GsonBuilder builder = new GsonBuilder();
builder.setLenient(); // this line help me to get response.
// builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
return builder.create();
}
感谢您的帮助。