1. 程式人生 > >Retrofit如何提交json資料

Retrofit如何提交json資料


用了一段時間的retrofit,感覺表單提交用的很6了,但是普通的json資料該如何提交呢?我以為我是懂的,然而我錯了。

一開始,我以為是這樣提交的:

@POST("NewLifeBeta/TeaLogin")
    Call<UserEntity> login(@Body JSONObect jsonObject);

然而將資料傳送過去之後我的程式喜聞樂見地崩了。

看retrofit的官方文件對於@Body是這樣描述的:

An object can be specified for use as an HTTP request body with the @Body annotation.

@POST("users/new")
Call<User> createUser(@Body User user);

The object will also be converted using a converter specified on the Retrofit instance. If no converter is added, only RequestBody can be used.

簡單翻譯一下就是,一個實體可以使用@Body註解的方式被指定用來作為Http的請求體,這個實體也會在Retrofit的例項中被轉換工廠做指定的轉換,如果沒有轉換被新增的話,只有RequestBody可以被使用。

雖然這句話最後的沒有新增轉換隻有RequestBody被使用我其實不是很理解(看網上的資料是有人說預設會將請求的實體類類轉換為json格式),但是我明白我之前的理解錯了,我以為傳送一個json類過去就好,沒想到Retrofit會利用轉換工廠自動將實體類轉換成json格式的資料,那麼想要傳json資料就變得非常簡單,首先我們定義一個想要傳送資料的實體類:

public class LoginUser {
    public String loginname;
    public String password;

    public LoginUser(String loginname, String password) {
        this.loginname = loginname;
        this.password = password;
    }
}

然後定義一個介面:
@POST("NewLifeBeta/TeaLogin")
    Call<UserEntity> login(@Body LoginUser loginUser);

最後:
public void login(View view) throws JSONException {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("loginname","s1");
        jsonObject.put("password","123456");

        LoginUser loginUser = new LoginUser("s1","123456");

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("url")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RetrofitWork retrofitWork = retrofit.create(RetrofitWork.class);
        Call<UserEntity> login = retrofitWork.login(loginUser);
        login.enqueue(this);
    }

轉換工廠這裡選擇Gson就直接會變成json格式,OK完成~