Android OkHTTP3无法通过身份验证

Android OkHTTP3无法通过身份验证,android,okhttp,okhttp3,Android,Okhttp,Okhttp3,我喜欢从网站上获取HTML。 此站点具有身份验证。 像这样的身份验证: 1个用户发送POST请求,正文中包含用户名和密码 2服务器检查用户主体 3若用户名和密码正常,服务器发送302,带有地址头,用于重定向,我可以从中获取HTML 4用户从位置向链接发送帖子并获取HTML。 5如果用户名和密码是错误的,服务器也会发送302,但在其他地址的位置有一个用于身份验证的表单 我有一个JavaScript代码,它的工作很好! 我想用OkHTTP 3.8.1在Android上做同样的事情,但我做不到,每次我

我喜欢从网站上获取HTML。 此站点具有身份验证。 像这样的身份验证:

1个用户发送POST请求,正文中包含用户名和密码 2服务器检查用户主体 3若用户名和密码正常,服务器发送302,带有地址头,用于重定向,我可以从中获取HTML 4用户从位置向链接发送帖子并获取HTML。 5如果用户名和密码是错误的,服务器也会发送302,但在其他地址的位置有一个用于身份验证的表单

我有一个JavaScript代码,它的工作很好! 我想用OkHTTP 3.8.1在Android上做同样的事情,但我做不到,每次我都有200个选项。下面是我的JavaScript代码:

var data = "auth-type=mo&username=SECRET&password=SECRET";
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://lk.mango-office.ru/auth");
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
xhr.send(data);
以下是我的错误OkHTPP代码:

public class MainActivity extends AppCompatActivity
{
    public String postUrl = "https://lk.mango-office.ru/auth";
    MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try
        {
            postRequest(postUrl, "auth-type=mo&username=SECRET&password=SECRET" );
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    void postRequest(String postUrl, String postBody) throws IOException
    {
        String str = postBody;
        OkHttpClient client = new OkHttpClient();
        RequestBody body = RequestBody.create(mediaType, postBody);
        Request request = new Request.Builder()
            .url("https://lk.mango-office.ru/auth")
            .post(body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();

        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call, IOException e)
            {
                call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException
            {
                Log.d("TAG", response.body().string());
            }
        });
    }
}

postbody应该是这样的

JSONObject body = new JSONObject();

body.put("auth-type", "mo");
body.put("username", "SECRET");
body.put("password", "SECRET");
然后用jsonobject的主体替换postbody

RequestBody body = RequestBody.create(mediaType, body.toString());
然后取下盖子

.addHeader("Content-Type", "application/x-www-form-urlencoded")

您可以尝试以下代码进行授权:

OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request original = chain.request();

                        String credentials = "username" + ":" + "password";
                        final String basic =
                                "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                        Request.Builder requestBuilder = original.newBuilder()
                                .header("Authorization", basic);

                        Request request = requestBuilder.build();
                        return chain.proceed(request);
                    }
                }).build();

@对不起,我不明白。你说我必须创建JSONObject,没关系。然后你说我必须把这个JSONObject传递给RequestBody.create。但我遇到了一个错误,因为RequestBody.create无法使用JSONObject。@Vryin现在正在编译,但仍然无法正常工作,就像JavaScript代码一样。您是否尝试将其添加到媒体类型中;charset=utf-8,类似于MediaType MediaType=MediaType.parseapplication/x-www-form-urlencoded;字符集=utf-8;我改为MediaType.parseapplication/x-www-form-urlencoded;charset=utf-8仍然不起作用。干得好,伙计。