gpt4 book ai didi

android - 使用 Volley POST 传递参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:57:03 24 4
gpt4 key购买 nike

我能够使用 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 时,调用 POST 但没有传递任何参数,当我使用 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 对象返回字符串或更确切地说是 Json 字符串。

JsonObjectRequest

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

字符串请求

StringRequest 发送正文类型为 x-www-form-urlencoded 的请求,但由于服务器需要一个 JSON 对象。你最终得到 400 Bad Request

解决方案

解决方案是将字符串请求中的内容类型更改为 JSON,并在正文中传递一个 JSON 对象。因为它已经期望您响应的字符串,所以您在那里很好。代码如下。

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

应该是

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

关于android - 使用 Volley POST 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40100807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com