使用Volley POST传递参数

时间:2016-10-18 06:12:39

标签: android android-volley azure-functions

我能够使用Postman和这些参数调用HTTP端点:

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);
    }

但是我无法通过Android对Volley采取同样的做法:这里尝试使用JSONRequest:

E/Volley: [13053] BasicNetwork.performRequest: Unexpected response code 400 for 

这里正在尝试StringRequest

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; }
}

当我使用JSONRequest时,调用POST但没有传递参数,当我使用StringRequest时,我得到以下错误?如何将JSON数据传递给Volley调用?

{{1}}

以下是处理请求的服务器代码

{{1}}

3 个答案:

答案 0 :(得分:14)

服务器代码期望JSON对象返回字符串或更确切地说是Json字符串。

<强> JsonObjectRequest

JSONRequest在请求正文中发送一个JSON对象,并期望响应中有一个JSON对象。由于服务器返回一个字符串,它最终会抛出ParseError

<强> StringRequest

StringRequest发送一个主体类型为ax = df1.plot() df2.plot(ax=ax) 的请求,但由于服务器需要一个JSON对象。你最终得到400 Bad Request

解决方案

解决方案是将字符串请求中的content-type更改为JSON,并在正文中传递JSON对象。因为它已经期待你回复的字符串,所以你很好。代码应该如下。

x-www-form-urlencoded

此外,服务器代码中还有一个错误

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) {
        mView.showMessage(error.getMessage());
    }
}) {
    @Override
    public byte[] getBody() throws AuthFailureError {
        HashMap<String, String> params2 = new HashMap<String, String>();
        params2.put("name", "Val");
        params2.put("subject", "Test Subject");
        return new JSONObject(params2).toString().getBytes();
    }

    @Override
    public String getBodyContentType() {
        return "application/json";
    }
};

var responseMessage = $"Hello {personToGreet}!";

答案 1 :(得分:0)

在标题

中添加内容类型
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}    

答案 2 :(得分:0)

您在传递参数时在哈希图中使用了params.put而不是params2.put。 因为您的对象名称是params2