【问题标题】:Retrofit JSON OBJECT Post改造 JSON 对象帖子
【发布时间】:2017-12-29 08:12:40
【问题描述】:

我想发送一个 json 对象来发布请求。

Json 具有下一个结构:

{ "email:"test@test.com",
  "password": "test",
   "hash": "true"
}

这在 POSTMAN 中效果很好,但我不知道如何像在 POSTMAN 中那样定义改造中的密钥。

此时,我创建了一个这样的@Body:

public class LoginRequest {


private String email;
private String password;
private String gethash;

public LoginRequest(String email, String password, String hash) {
    this.email = email;
    this.password = password;
    this.gethash = hash;
}

}

但我真的不知道我必须在哪里定义密钥。 然后,我尝试像这样调用 POST 请求:

【问题讨论】:

    标签: android json retrofit rx-java rx-android


    【解决方案1】:

    在端点定义中使用 @Field("json") 而不是 @Body

    @POST("/login")
    public Observable<DataLogin> getLogin(@Field("json") LoginRequest loginRequest);
    

    此外,您必须使用转换器来转换对象。这是 GSON 的示例。您基本上需要为默认的GsonConverterFactory 创建一个自定义包装器,因为它没有实现将带有@Field 等注释的值转换为字符串的stringConverter(...) 方法。

    public class GsonStringConverterFactoryWrapper extends Converter.Factory {
        private GsonConverterFactory converterFactory;
    
        public static GsonStringConverterFactoryWrapper create() {
            return create(new Gson());
        }
    
        @SuppressWarnings("ConstantConditions")
        public static GsonStringConverterFactoryWrapper create(Gson gson) {
            if (gson == null) throw new NullPointerException("gson == null");
            return new GsonStringConverterFactoryWrapper(gson);
        }
    
        private final Gson gson;
    
        private GsonStringConverterFactoryWrapper(Gson gson) {
            this.gson = gson;
            converterFactory = GsonConverterFactory.create(gson);
        }
    
        @Override
        public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
                                                                Retrofit retrofit) {
            return converterFactory.responseBodyConverter(type, annotations, retrofit);
        }
    
        @Override
        public Converter<?, RequestBody> requestBodyConverter(Type type,
                                                              Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
            return converterFactory.requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit);
        }
    
        @Nullable
        @Override
        public Converter<?, String> stringConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
            return new GsonStringConverter<>(gson);
        }
    
        public static class GsonStringConverter<T> implements Converter<T, String> {
            private final Gson gson;
    
            GsonStringConverter(Gson gson) {
                this.gson = gson;
            }
    
            @Override
            public String convert(@NonNull T value) throws IOException {
                return gson.toJson(value);
            }
        }
    }
    

    然后,当您创建 Retrofit 实例时,只需使用此适配器:

    new Retrofit.Builder()
     .addConverterFactory(GsonStringConverterFactoryWrapper.create(gson)) // if you don't have a custom GSON instance, just call .create()
     // [...] other settings
     .build();
    

    【讨论】:

    • 现在我可以执行但总是返回无法验证,检查一下,似乎我的对象为空,但不明白为什么。
    • 我不知道你用的是哪种转换器工厂,但似乎GsonConverterFactory 没有实现stringConverter。我会更新答案,为 GSON 创建一个新的转换器。
    • 谢谢你的回答,我到家时试试看。
    • 非常感谢,我可以找到我所有的错误,并且在您的课程中,现在一切都已解决。也感谢您的耐心等待。
    【解决方案2】:
    @FormUrlEncoded
    @POST("/login")
    public Observable<DataLogin> getLogin(@Field("json") String json);
    

    【讨论】:

    • 拥有它。我还有一个错误。仅当我使用 LoginRequest 对象时才有效。感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2016-06-13
    • 2017-09-02
    • 2017-08-02
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多