我试图通过使用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"
的请求标头,而不是提交表单后收到的响应标头。如何提交表单并获取响应标题?
答案 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);