Как использовать почтовый запрос AsyncHttpClient с библиотекой loopj при использовании аутентификации на основе токенов
Я использую Token Based Authentication в своем проекте для управления аутентификацией при входе. Моя аутентификация на основе токенов требует:
Header: Accept Value: application/json
Header: Content-Type Value: application/x-www-form-urlencoded
Key: grant_type Value: password
Key: username Value: <NameToControl>
Key: password Value: <PasswordToControl>
URL моей аутентификации на основе токенов: http://localhost:5978/GetAccessToken будет.
Когда я публикую эти параметры в PostMan, проблем не возникает. Но я не могу сделать это в моем приложении для Android. Я выполняю вызов службы в приложении для Android, но ответа нет. Как я могу это исправить?
Мой класс статического клиента:
public class PropClient {
private static final String BASE_URL = "http://localhost:5978/";
private static AsyncHttpClient client = new AsyncHttpClient();
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
}
public static void post(Context context,String url, StringEntity entity, AsyncHttpResponseHandler responseHandler) {
client.addHeader("Accept", "application/json");
client.addHeader("Content-Type", "application/x-www-form-urlencoded");
entity.setContentType("application/json");
client.post(context, getAbsoluteUrl(url), entity, "application/json", responseHandler);
}
private static String getAbsoluteUrl(String relativeUrl) {
String url = BASE_URL + relativeUrl;
return url;
}
}
Мой класс MainActivity:
JSONObject jsonParams = new JSONObject();
jsonParams.put("grant_type", "password");
jsonParams.put("username", mEmail);
jsonParams.put("password", mPassword);
StringEntity entity=null;
try {
entity = new StringEntity(jsonParams.toString());
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
PropClient.post(getBaseContext(), "GetAccessToken", entity, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// If the response is JSONObject instead of expected JSONArray
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
// Pull out the first event on the public timeline
// Do something with the response
}
@Override
public void onFailure(int statusCode, Header[] headers, String response, Throwable e) {
}
@Override
public void onRetry(int retryNo) {
// called when request is retried
}
});
2 ответа
В клиентском классе yourStatic попробуйте приватную статическую final String BASE_URL = " http://xxx.xxx.x.xx:xxxx/"; это будет работать, затем проверьте свой IP-адрес и поместите его вместо localhost
Проблема в том, что вы используете JSONObject для хранения параметров, а неправильная интерпретация неверна. Вы должны отправить строку как это:
grant_type=password&username=demomail@example.it&password=Password1!
Используйте RequestParams и замените это:
JSONObject jsonParams = new JSONObject();
jsonParams.put("grant_type", "password");
jsonParams.put("username", mEmail);
jsonParams.put("password", mPassword);
StringEntity entity=null;
try {
entity = new StringEntity(jsonParams.toString());
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
с:
RequestParams params = new RequestParams();
params.put("grant_type", "password");
params.put("username", mEmail);
params.put("password", mPassword);
StringEntity entity=null;
try {
entity = new StringEntity(params.toString());
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded; charset=UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}