【发布时间】:2018-11-07 04:56:47
【问题描述】:
我能够使用 Postman 和这些参数调用 HTTP 端点:
{
"name":"Val",
"subject":"Test"
}
但是我无法通过 Android 对 Volley 做同样的事情:这里正在尝试使用 JSONRequest:
HashMap<String, String> params2 = new HashMap<String, String>();
params.put("name", "Val");
params.put("subject", "Test Subject");
JsonObjectRequest jsObjRequest = new JsonObjectRequest
(Request.Method.POST, Constants.CLOUD_URL, new JSONObject(params2), new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
mView.showMessage("Response: " + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
mView.showMessage(error.getMessage());
}
});
// Access the RequestQueue through your singleton class.
VolleySingleton.getInstance(mContext).addToRequestQueue(jsObjRequest);
这里正在尝试 StringRequest
private void postMessage(Context context, final String name, final String subject ){
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest sr = new StringRequest(Request.Method.POST, Constants.CLOUD_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
mView.showMessage(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("name", name);
params.put("subject", subject);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","application/x-www-form-urlencoded");
return params;
}
};
queue.add(sr);
}
当我使用 JSONRequest 时,调用 POSTs 但未传递任何参数,当我使用 StringRequest 时出现以下错误?如何将 JSON 数据传递给 Volley 调用?
E/Volley: [13053] BasicNetwork.performRequest: Unexpected response code 400 for
这是处理请求的服务器代码
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
var helloRequest = await req.Content.ReadAsAsync<HelloRequest>();
var name = helloRequest?.Name ?? "world";
var responseMessage = $"Hello {personToGreet}!";
log.Info($"Message: {responseMessage}");
return req.CreateResponse(HttpStatusCode.OK, $"All went well.");
}
public class HelloRequest
{
public string Name { get; set; }
public string Subject { get; set; }
}
【问题讨论】:
-
服务器是否接受 JSON 或 URL 编码形式?
new JSONObject(params2)是使用JSONObjectRequest的正确方法。您的StringRequest没有传递 JSON 数据。查看getHeaders()中的Content-Type -
您能否向我们展示您正在处理 POST 请求的服务器部分?您的 JSONObject POST 请求看起来不错。
-
我已经添加了处理这个请求的服务器代码。
标签: android android-volley azure-functions