当前位置: 首页 > 知识库问答 >
问题:

如何使用自定义对象作为参数制作Volley JSONObject请求?

卫成和
2023-03-14

我试图使用Volley库向服务器发出一个JSONObject POST请求,该请求包含两个参数,一个对象(地址)和一个不同对象(租户)的列表。

当我尝试发出请求时,第一个参数(地址)在发送之前被截取格式化,服务器不接受该请求。

我的请求如下所示:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST, SERVER_URL,
    postPropertyJSONObject, responseListener, errorListener)

我的postPropertyJSONObject是这样创建的:

JSONObject obj = new JSONObject();
obj.put("Address", convertAddressToJson(property.getAddress()).toString());
obj.put("Tenants", prop.getTenantList());

convertAddressToJson()方法如下所示:

JSONObject jsonObject= new JSONObject();
jsonObject.put("Building", address.getBuilding());
jsonObject.put("Street", address.getStreet());
jsonObject.put("Town", address.getTown());
jsonObject.put("ZipCode", address.getZipCode());
jsonObject.put("County", address.getCounty());
jsonObject.put("Country", address.getCountry());

我尝试只是传递地址对象,但这根本没有序列化,所以它也不起作用。我还尝试在请求中使用的JSONObject的“地址”字段中传递ddress.to字符串(),但这也不起作用。

my Property对象的getAddress()方法返回一个地址对象,如下所示:

public class Address {

    private String Street;
    private String Building;
    private String Town;
    private String ZipCode;
    private String County;
    private String Country;
    // getters and setters
}

当我在传递请求之前记录地址时,它看起来如下所示:

{"Town":"MyTown","Street":"MyStreet","County":"MyCounty","Country":"MyCountry",
 "ZipCode":"MyZipCode","Building":"MyBuilding"}

但是,当服务器记录它接收到的内容时,它看起来是这样的:

{\"Town\":\"MyTown\",\"Street\":\"MyStreet\",\"County\":\"MyCounty\",
 \"Country\":\"MyCountry\",\"ZipCode\":\"MyZipCode\",\"Building\":\"MyBuilding\"}"

Volley应用的这种格式似乎改变了我在请求中传递的值,所以有人能告诉我是否有更好的方法来完成这项任务,而且应该相对简单?我使用字符串和整数值向同一服务器发出请求,但在尝试将自定义类作为参数传递时遇到了这个问题。

编辑

使用wbelarmino的提示,我切换到使用hashmap来存储我的自定义对象,并从中创建了一个JSONObject:

HashMap<String, Address> params = new HashMap<String, Address>();
params.put("Address", prop.getAddress());
requestObject = new JSONObject(params);

共有2个答案

申黎明
2023-03-14
 final RequestQueue requestQueue = Volley.newRequestQueue(this);
    final String url ="http://mykulwstc000006.kul/Services/Customer/Register";
    Map<String, String>  params = new HashMap<String, String>();
    params.put("MobileNumber", "+97333765439");
    params.put("EmailAddress", "danish.hussain4@das.com");
    params.put("FirstName", "Danish2");
    params.put("LastName", "Hussain2");
    params.put("Country", "BH");
    params.put("Language", "EN");
    JsonObjectRequest req = new JsonObjectRequest(url, new JSONObject(params),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        VolleyLog.v("Response:%n %s", response.toString(4));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.e("Error: ", error.getMessage());
        }
    }){
        @Override
        public String getBodyContentType() {
            return "application/json; charset=utf-8";
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            String username ="eli@gmail.com";
            String password = "elie73";

            String auth =new String(username + ":" + password);
            byte[] data = auth.getBytes();
            String base64 = Base64.encodeToString(data, Base64.NO_WRAP);
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Authorization","Basic "+base64);
            return headers;
        }

    };
    requestQueue.add(req);
}
丁曦哲
2023-03-14

您可以尝试以下方法

final String URL = "/volley/resource/12";

将要发送到服务器的Post参数

HashMap<String, String> params = new HashMap<String, String>();
params.put("token", "AbCdEfGh123456");

JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params),
new Response.Listener<JSONObject>() {
   @Override
   public void onResponse(JSONObject response) {
       try {
           VolleyLog.v("Response:%n %s", response.toString(4));
       } catch (JSONException e) {
           e.printStackTrace();
       }
   }
}, new Response.ErrorListener() {
   @Override
   public void onErrorResponse(VolleyError error) {
       VolleyLog.e("Error: ", error.getMessage());
   }
});

在android中使用Volley查看更多Http请求

 类似资料:
  • 在xsl样式表中调用该对象的实例方法,如下所示: 我的问题是:这样做是否恰当?哪种XSLT处理器适合以这种方式使用参数?还有别的办法吗? 我试用了Xalan(org.apache.Xalan.xsltc.trax.TransformerFactoryImpl),但遇到一个异常,即找不到该方法: 该方法是公共的,没有参数。

  • 网上搜索到cpp代码制作自定义的定时器,我制作了测试用的项目,仓库是:https://gitee.com/chanchaw/custom-timer-cc.git 测试下来发现在 main 函数中启动定时任务后,下面的 cout 没有输出到控制台中,是不是意味着定时任务没有创建子线程执行?如果是的话要如何修改代码?

  • 问题内容: 以下工作正常,但是我认为这会全局修改$ httpProvider,这不是我想要的。 反正有这样做吗? “标题”参数似乎被忽略了。请求仍然 我的标头值可以吗? 问题答案: 我已经确认1.1.3确实支持这一点。但是,您需要确保您还获得了资源服务的1.1.3版本。快速测试: 这将发出一个标头设置为(使用Chrome确认)的请求: 快速说明,我无法找到angular- resource.js的

  • 我已经查看了各种答案,但它们并没有解决我的问题。我有一个非常具体的客户需求,我无法使用请求的主体。 我已经检查了这些帖子: 尝试使用Spring Boot REST从POST读取JSON字符串 使用Jackson JSON在Spring MVC中解析JSON 在Rest web方法中传递JSON对象 注意:我确实对URI进行了编码。 我得到各种错误,但非法的超文本标记语言字符是一个。要求很简单:

  • 考虑下面的代码: 对于上面的代码,输出是: