与改装

时间:2016-04-14 13:49:46

标签: android retrofit okhttp

使用retrofit我想向http://milzinas.lt/oauthsilent/authorize发出POST请求。此网址很特殊,因为它会将您重定向到http://milzinas.e-bros.lt/oauthsilent/authorize。我的改造设置使用OkHttpClient。如果我只使用OkHttpClient发出请求,那么重定向工作正常,即收到401状态代码。但是,当我使用相同的OkHttpClient进行改造时,响应是状态代码307.我认为这与包含OkHttpClient的OkClient实现有关,但我不确定。下面是我用来测试这个场景的代码。我正在使用这些库:

com.squareup.retrofit:retrofit:1.9.0
com.squareup.okhttp:okhttp:2.2.0

据我所知,当URL将您重定向到另一个URL时,http客户端必须发出两个请求。在我的情况下,第一个请求返回307(临时重定向),第二个请求返回401(未授权)。但是,改造始终返回第一个请求的响应。你知道如何通过改造使重定向工作正常吗?也许我可以通过使用其他一些HTTP客户端来实现这一点?任何建议将不胜感激。

所以当我在控制台打印下执行代码时

Retrofit failure. Status: 307
OkHttp. Status: 401

我希望它是

Retrofit failure. Status: 401
OkHttp. Status: 401
public class MainActivity extends AppCompatActivity {

interface Api {

    @POST(URL)
    @Headers("Accept: application/json")
    void test(@Body Object dummy, Callback<Object> callback);

}

static final String BASE_URL = "http://milzinas.lt";
static final String URL = "/oauthsilent/authorize";

final OkHttpClient okHttpClient = new OkHttpClient();
Api api;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    RestAdapter retrofit = new RestAdapter.Builder()
            .setEndpoint(BASE_URL)
            .setClient(new OkClient(okHttpClient))
            .setConverter(new Converter() {
                @Override
                public Object fromBody(TypedInput body, Type type) throws ConversionException {
                    return null;
                }

                @Override
                public TypedOutput toBody(Object object) {
                    return null;
                }
            })
            .build();

    api = retrofit.create(Api.class);

    makeRequestOkHttp();
    makeRequestRetrofit();
}

void makeRequestOkHttp() {
    new AsyncTask<Object, Object, Object>() {
        @Override
        protected Object doInBackground(Object... objects) {
            try {
                Request request = new Request.Builder().url(BASE_URL + URL).build();
                com.squareup.okhttp.Response response = okHttpClient.newCall(request).execute();
                android.util.Log.d("matka", "OkHttp. Status: " + response.code());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            return null;
        }
    }.execute();
}

void makeRequestRetrofit() {
    api.test("", new Callback<Object>() {
        @Override
        public void success(Object o, Response response) {
            android.util.Log.d("matka", "Retrofit success. Status: " + response.getStatus());
        }

        @Override
        public void failure(RetrofitError error) {
            android.util.Log.d("matka", "Retrofit failure. Status: " + error.getResponse().getStatus());
        }
    });
}

}

1 个答案:

答案 0 :(得分:1)

即使在最新的v3.5.0中,问题仍然存在 唯一有效的解决方法是 https://github.com/square/okhttp/issues/936#issuecomment-266430151