Я пытаюсь заставить этот логин работать, но по какой-то причине он всегда возвращает код 422, когда пытаюсь отправить данные для получения токена API. Я не уверен в процессе входа в систему и сохранении токена для дальнейшего использования.
Это настройка модернизации
Gson gson = new GsonBuilder().serializeNulls().create();
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@NotNull
@Override
public okhttp3.Response intercept(@NotNull Chain chain) throws IOException {
Request originalRequest = chain.request();
Request newRequest = originalRequest.newBuilder()
.build();
return chain.proceed(newRequest);
}
})
.addInterceptor(loggingInterceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.4:8000/api/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
Это код, который у меня есть, это Api Интерфейс, модель входа в систему имеет только эти три поля с обычной настройкой модели
@FormUrlEncoded
@Headers({"Accept: application/json", "Content-Type: multipart/form-data"})
@POST("sanctum/token")
Call<Login> LoginUser(
@Field("scard") String scard,
@Field("password") String password,
@Field("device_name") String device_name
);
Это код, в котором я пытаюсь выполнить вход в систему и получить токен, маршрут API возвращает это
{
"user": {
"id": 1,
"name": "ny",
"lastname": "gz",
"maidenname": "ua",
"card": "1192",
"scard": "134",
"email": "ny@gmail.com",
"created_at": "2020-03-25 15:47:44",
"updated_at": "2020-03-25 15:47:44"
},
"token": "M5VoPEhhow..."
}
Попытка входа в систему, ответ всегда 422
scardText = (EditText) findViewById(R.id.scardET);
passwordText = (EditText) findViewById(R.id.passwordET);
Button loginbtn = (Button) findViewById(R.id.loginbtn);
loginbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String scardI = scardText.getText().toString();
String passwordI = passwordText.getText().toString();
String device_name = Settings.Secure.getString(getContentResolver(), "bluetooth_name");
String loginNew = loginnew.toString();
textViewResult.append(scardI + passwordI);
Call<Login> call = jsonPlaceHolderApi.LoginUser(scardI, passwordI, device_name);
call.enqueue(new Callback<Login>() {
@Override
public void onResponse(Call<Login> call, Response<Login> response) {
if (!response.isSuccessful()) {
textViewResult.append("Code: " + response.code() + "\n");
return;
}
}
@Override
public void onFailure(Call<Login> call, Throwable t) {
textViewResult.setText(t.getMessage());
}
});
}
});
Это в logcat в AndroidStudio
D/OkHttp: Content-Type: multipart/form-data
D/OkHttp: Content-Length: 57
D/OkHttp: Accept: application/json
D/OkHttp: scard=134&password=password&device_name=Galaxy%20Note8
D/OkHttp: --> END POST (57-byte body)
D/TcpOptimizer: TcpOptimizer-ON
D/OkHttp: <-- 422 Unprocessable Entity http://192.168.0.4:8000/api/sanctum/token (841ms)
D/OkHttp: Host: 192.168.0.4:8000
D/OkHttp: Date: Tue, 31 Mar 2020 18:27:47 GMT
D/OkHttp: Connection: close
D/OkHttp: X-Powered-By: PHP/7.3.10
D/OkHttp: Cache-Control: no-cache, private
D/OkHttp: Date: Tue, 31 Mar 2020 18:27:47 GMT
D/OkHttp: Content-Type: application/json
D/OkHttp: X-RateLimit-Limit: 60
D/OkHttp: X-RateLimit-Remaining: 59
D/OkHttp: <br />
D/OkHttp: <b>Warning</b>: Missing boundary in multipart/form-data POST data in <b>Unknown</b> on line <b>0</b><br />
D/OkHttp: {"message":"The given data was invalid.","errors":{"scard":["The scard field is required."],"password":["The password field is required."],"device_name":["The device name field is required."]}}
D/OkHttp: <-- END HTTP (308-byte body)