如何使用Retrofit2发布数据?

时间:2019-05-22 05:53:45

标签: java android retrofit2

我正在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解决方案,但没有帮助。请大家帮我解决这个问题。任何帮助将不胜感激。谢谢。 This is the form data image. i am sending data in the BODY field

This is header data image

This is raw data image

3 个答案:

答案 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();
}

感谢您的帮助。