改进表格提交

时间:2016-01-25 21:34:40

标签: android retrofit okhttp

我试图通过使用RetroFit填写登录表单来登录CAS服务。这是我的身份验证界面:

public interface AuthService {
    @FormUrlEncoded
    @POST("/cas/login")
    void login(@Field("username") String username,
            @Field("password") String password, Callback<Response> result);
}

当我尝试使用此界面时,打印结果:

new RestClient().getAuthService().login(
        mUsername.getText().toString(), mPassword.getText().toString(),
        new Callback<Response>() {
            @Override
            public void success(Response result, Response response) {
                for(Header header : response.getHeaders()) {
                    Timber.d(header.getName() + ": " + header.getValue());
                }
            }
        });

我收到了"login.example.com/cas/login"的请求标头,而不是提交表单后收到的响应标头。如何提交表单并获取响应标题?

1 个答案:

答案 0 :(得分:1)

必须使用

@GET代替@POST来填写表单并接收回复。所有表单值也必须作为查询提交。在此过程中,我切换到Retrofit 2,但我也会发布等效的Retrofit代码。

由于这个特定表单的设置方式,我还必须调用表单一次来解析某些项的值(登录票,执行和事件),第二次输入这些值加上用户名和密码。这会给我正确的答案,并使我能够设置正确的cookie。

改造2:

@GET("cas/login")
Observable<ResponseBody> login(@Query("lt") String loginTicket,
                            @Query("execution") String execution,
                            @Query("event") String event,
                            @Query("username") String username,
                            @Query("password") String password,
                            @Query("submit") String submit);

改造1:

@GET("/cas/login")
void login(@Query("lt") String loginTicket,
            @Query("execution") String execution,
            @Query("event") String event,
            @Query("username") String username,
            @Query("password") String password,
            @Query("submit") String submit,
            ResponseBody response);