当前位置: 首页 > 知识库问答 >
问题:

OkHttp在与改装一起使用时不会重定向POST请求

闻人树
2023-03-14

使用改装我想向http://milzinas.lt/oauthsilent/authorize 。此URL是特殊的,因为它将您重定向到http://milzinas.e-bros.lt/oauthsilent/authorize 。我的改装设置使用OkHttpClient。如果我仅使用OkHttpClient发出请求,则重定向工作正常,即收到401状态代码。然而,当我将同一个OkHttpClient用于改装时,响应是状态代码307。我认为这与包装OkHttpClient的实现有关,但我不确定。下面是我用来测试这个场景的代码。我正在使用这些库:

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个答案

欧阳子石
2023-03-14

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

 类似资料:
  • 我有一个网页,这是一个邮政路线。这个页面有一个删除按钮,可以路由到另一个POST路由,在这里我删除指定的数据库行并重定向回第一个页面。 问题是,当我使用任何back()或reway()函数时,它们似乎会产生对上一个URL的GET请求。但上一页是仅限POST页。 如何将POST请求和POST数据重定向回?

  • 问题内容: 我想从一个URL请求重定向到另一个“ POST”请求,如下所示: 但是,我无法重定向到“ / test”页面,因为它是POST请求。 那么,在保持“ / test”请求POST的情况下,如何使重定向工作呢? 问题答案: 你可以这样做: 它将保留send方法。 供参考,307 http代码规范为: 307临时重定向(自HTTP / 1.1起)在这种情况下,应使用另一个URI重复请求,但是

  • 我阅读了一些将jsons发布到服务器的示例。 有人说: OkHttp是Java提供的HttpUrlConnection接口的实现。它提供了一个用于写入内容的输入流,而不知道(或关心)该内容是什么格式。 现在我想用name和password参数对URL做一个普通的post。 这意味着我需要自己将名称和值对编码成流?

  • 我不能用HttpEntity调用Spring RestTem板进行POST请求。我调用RestTem板给出Base64字符串在邮递员,但使用我的java实现,它会给出以下错误: 我的实施是: 我尝试过以下解决方案,但在这里不起作用 这个我也提到过这个

  • 这是我得到的错误: 通用域名格式。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN_对象,但在第1行第1列路径处为字符串$ 我从邮递员那里得到的JSON回复: 这就是我如何响应rest API(使用slim2框架)的响应: 回声响应方法: 调用API的方法: APIServie界面: 我如何获得实例: 我发布所有这些