Retrofit 2.0抛出"IllegalArgumentException:@Field参数只能与表单编码一起使用".如何做正确的API查询并修复它?

y07*_*7k2 34 java api android retrofit retrofit2

我的问题是我不知道如何开始使用收到的API的Retrofit 2.0 - 下面提到...

首先,我需要用户名,密码,fbID(可选),gmailID(可选),twitID(可选),性别,birthDate,位置(不需要 - 如果long和lat有值),经度(可选),纬度(可选) ,profileImage(可选).

当所有参数都很好时 - 接收status = true.如果不是 - 接收status = false和所需的参数错误(例如已经收到邮件)

所以我可以接收 status = true 或者 status = false使用最多5个参数(用户名,电子邮件,密码,性别,birthDate)进行数组.

我试过这个API Interface:

public interface AuthRegisterUserApi {
    @PUT()
    Call<AuthRegisterUserModel> getStatus(
            @Field("username") String username,
            @Field("email") String email,
            @Field("password") String password,
            @Field("fbID") String fbID,
            @Field("gmailID") String gmailID,
            @Field("twitID") String twitID,
            @Field("gender") String gender,
            @Field("birthDate") String birthDate,
            @Field("location") String location,
            @Field("longitude") String longitude,
            @Field("latitude") String latitude,
            @Field("profileImage") String profileImage
            );

    class Factory {
        private static AuthRegisterUserApi service;

        public static AuthRegisterUserApi getInstance() {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(ApiConstants.REGISTER_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

            service = retrofit.create(AuthRegisterUserApi.class);

            return service;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此API模型(Pastebin.com)

这个代码在Activity:

AuthRegisterUserApi.Factory.getInstance()
        .getStatus(
                usernameEditText.getText().toString(),
                emailEditText.getText().toString(),
                passwordEditText.getText().toString(),
                "", "", "",
                (maleRadioButton.isChecked() ? "male" : "female"),
                mYear + "-" + mMonth+1 + "-" + mDay,
                (geoLocationToggleButton.isChecked() ? geoLocationEditText.getText().toString() : ""),
                (!geoLocationToggleButton.isChecked() ? "50" : ""),
                (!geoLocationToggleButton.isChecked() ? "50" : ""),
                "")
        .enqueue(new Callback<AuthRegisterUserModel>() {
    @Override
    public void onResponse(Call<AuthRegisterUserModel> call, Response<AuthRegisterUserModel> response) {
        if(response.isSuccessful()) {
            if (response.body().isStatus()) {
                showToast(getApplicationContext(), "Registration ok.");
            } else {
                response.body().getInfo().getUsername();
            }
        }
    }

    @Override
    public void onFailure(Call<AuthRegisterUserModel> call, Throwable t) {

    }
});
Run Code Online (Sandbox Code Playgroud)

我有错误: java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. (parameter #1) for method AuthRegisterUserApi.getStatus

我尝试使用Postman注册用户,当我使用选项Body- > 时它可以工作x-www-form-urlencoded.

如何创建register此查询到此API?换成@Field其他东西?我总是得到这个错误......

编辑:需要更改API Interface:

public interface AuthRegisterUserApi {
    @FormUrlEncoded
    @PUT("/api/register")
    Call<AuthRegisterUserModel> getStatus(
            @Field("username") String username,
            @Field("email") String email,
            @Field("password") String password,
            @Field("fbID") String fbID,
            @Field("gmailID") String gmailID,
            @Field("twitID") String twitID,
            @Field("gender") String gender,
            @Field("birthDate") String birthDate,
            @Field("location") String location,
            @Field("longitude") String longitude,
            @Field("latitude") String latitude,
            @Field("profileImage") String profileImage
            );

    class Factory {
        private static AuthRegisterUserApi service;

        public static AuthRegisterUserApi getInstance() {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(ApiConstants.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

            service = retrofit.create(AuthRegisterUserApi.class);

            return service;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

BASE_URL = http://ip_address:8400 为了我...

但仍然有错误:Response.rawResponse = Response{protocol=http/1.1, code=400, message=Bad Request, url=http://ip_address:8400/api/register}.使用Postman和我收到的相同数据代码= 201 Created.不知道为什么......

Rap*_*ier 38

您的请求编码不正确,但是邮递员,所以请更改:

@FormUrlEncoded
@PUT("/api/register")
    Call<AuthRegisterUserModel> getStatus(
            @Field("username") String username,
            @Field("email") String email,
            @Field("password") String password,
            @Field("fbID") String fbID,
            @Field("gmailID") String gmailID,
            @Field("twitID") String twitID,
            @Field("gender") String gender,
            @Field("birthDate") String birthDate,
            @Field("location") String location,
            @Field("longitude") String longitude,
            @Field("latitude") String latitude,
            @Field("profileImage") String profileImage);
Run Code Online (Sandbox Code Playgroud)

告诉我它是否正常.


Raj*_*h.k 23

你错过了@FormUrlEncodedRest方法调用之上的错误.


y07*_*7k2 8

问题是,因为我尝试PUTlongitude\ latitude\ location没有价值-空String.

我的意思是 - 在API方面存在问题.所以为了避免我改变方法:

@FormUrlEncoded
@PUT(ApiConstants.REGISTER_URL_PART)
Call<RegisterModel> registerUser(
        @Field("username") String username,
        @Field("email") String email,
        @Field("password") String password,
        @Field("fbID") String fbID,
        @Field("gmailID") String gmailID,
        @Field("twitID") String twitID,
        @Field("gender") String gender,
        @Field("birthDate") String birthDate,
        @Nullable @Field("location") String location,
        @Nullable @Field("longitude") String longitude,
        @Nullable @Field("latitude") String latitude,
        @Field("profileImage") String profileImage
);
Run Code Online (Sandbox Code Playgroud)

现在,当我对其中一个没有价值时,我根本就没有把这个字段括起来.


Sau*_*iar 5

我收到了一条类似的错误消息,我注意到在我的接口定义中我错过了 @ForUrlEncoded 注释 - 在将使用表单部分的其余调用之上,这似乎与您在第一个发布的代码块中所做的相同。看一看。

希望这可以帮助。