Строка POST для Android Volbody в теле
Я пытаюсь использовать библиотеку Volley для связи с моим API RESTful.
У меня есть строка POST в теле, когда я прошу предъявить токен. Строка должна выглядеть так:
grant_type = пароль & имя пользователя = Alice & пароль = password123
И заголовок:
Content-Type: application/x-www-form-urlencoded
Дополнительная информация о индивидуальных аккаунтах WebApi:
http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api
К сожалению, я не могу понять, как это решить.
Я пробую что-то вроде этого:
StringRequest req = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
VolleyLog.v("Response:%n %s", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.e("Error: ", error.getMessage());
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("grant_type", "password");
params.put("username", "User0");
params.put("password", "Password0");
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/x-www-form-urlencoded");
return headers;
}
};
Я получаю 400 Bad Request все время.
Я думаю, что я действительно отправляю запрос следующим образом:
grant_type:password, username:User0, password:Password0
вместо:
grant_type=password&username=Alice&password=password123
Буду очень признателен, если у кого-нибудь есть идеи или советы.
Ответы
Ответ 1
Во-первых, я советую вам точно видеть, что вы отправляете, либо печатая в журнал, либо используя сетевой сниффер, например wirehark или скрипт.
Как насчет того, чтобы поместить параметры в тело? Если вы все еще хотите StringRequest
, вам нужно будет расширить его и переопределить метод getBody()
(аналогично JsonObjectRequest
)
Ответ 2
Чтобы отправить обычный запрос POST (без JSON) с такими параметрами, как имя пользователя и пароль, вы обычно переопределяете getParams() и передаете карту параметров:
public void HttpPOSTRequestWithParameters() {
RequestQueue queue = Volley.newRequestQueue(this);
String url = "http://www.somewebsite.com/login.asp";
StringRequest postRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
Log.d("Response", response);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
Log.d("ERROR","error => "+error.toString());
}
}
) {
// this is the relevant method
@Override
protected Map<String, String> getParams()
{
Map<String, String> params = new HashMap<String, String>();
params.put("grant_type", "password");
// volley will escape this for you
params.put("randomFieldFilledWithAwkwardCharacters", "{{%stuffToBe Escaped/");
params.put("username", "Alice");
params.put("password", "password123");
return params;
}
};
queue.add(postRequest);
}
И чтобы отправить стробированную строку как данные тела POST в Volley StringRequest, вы переопределите getBody()
public void HttpPOSTRequestWithArbitaryStringBody() {
RequestQueue queue = Volley.newRequestQueue(this);
String url = "http://www.somewebsite.com/login.asp";
StringRequest postRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
Log.d("Response", response);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
Log.d("ERROR","error => "+error.toString());
}
}
) {
// this is the relevant method
@Override
public byte[] getBody() throws AuthFailureError {
String httpPostBody="grant_type=password&username=Alice&password=password123";
// usually you'd have a field with some values you'd want to escape, you need to do it yourself if overriding getBody. here how you do it
try {
httpPostBody=httpPostBody+"&randomFieldFilledWithAwkwardCharacters="+URLEncoder.encode("{{%stuffToBe Escaped/","UTF-8");
} catch (UnsupportedEncodingException exception) {
Log.e("ERROR", "exception", exception);
// return null and don't pass any POST string if you encounter encoding error
return null;
}
return httpPostBody.getBytes();
}
};
queue.add(postRequest);
}
В стороне, документации Volley нет, и качество ответов StackOverflow довольно плохое. Не могу поверить, что ответ с примером вроде этого уже не был здесь.
Ответ 3
Я знаю, что это старо, но я столкнулся с этой же проблемой, и здесь найдено гораздо более эффективное решение imo: Как отправить запрос POST с помощью volley с телом строки?