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