【问题标题】:sending a JSONArray containing only a string in retrofit在改造中发送仅包含字符串的 JSONArray
【发布时间】:2018-06-04 04:35:16
【问题描述】:

所以我正在尝试发出服务器请求,该请求的预期正文如下所示:["1"]

但如果我将字符串发送为"[\"1\"]",则会收到错误消息

查看正文,很明显我必须发送 JSONArray ,我尝试使用以下代码实现此目的:

JSONArray array = new JSONArray();
array.put("1");

但我在听诊器上的身体显示为:

{
    "values":["1"]
}

也许我使用了错误的类或其他东西!

编辑:

这是我的 api 调用

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .addNetworkInterceptor(new StethoInterceptor())
                    .build();

RetrofitService retrofitService2 =new Retrofit.Builder()
                    .baseUrl("http://blynk-cloud.com/")
                    .client(okHttpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
                    .create(RetrofitService.class);

retrofitService2.closeDoor("3bf11f14e6094dd5a8f31f6d6fac8f3d",
                    "[\"1\"]")
                    .enqueue(new Callback<String>() {
                        @Override
                        public void onResponse(Call<String> call, Response<String> response) {
                           {

                            }

                        }

                        @Override
                        public void onFailure(Call<String> call, Throwable t) {

                        }
                    });

closeDoor 方法:

@PUT("/{id}/update/D12")
    Call<String> closeDoor(@Path("id") String id, @Body String code);

我的听诊器反应:

【问题讨论】:

  • ["1"] 不是格式正确的 JSON 字符串。如果这是您必须发送的内容,那么您将无法从任何 Android JSON 类中获取它;你只需要自己构造字符串并发送它。
  • 我使用 "[\"1\"]" 将 ["1"] 作为字符串发送,但它仍然给我同样的问题
  • 您能否更新您的帖子以包含您用于创建 HTTP 请求并发送它的代码?您使用的是原生 HttpURLConnection 类还是 HTTP 库?
  • 在这里使用改造我得到服务器错误代码 500,一切似乎都很好,除了身体,你确定是这样吗?
  • 发布你的RetrofitService接口,至少closeDoor方法。那里可能有一些线索。

标签: java android arrays json retrofit


【解决方案1】:

如果你想像这样发送请求 JSON ["1"]

改为:

    JsonArray array = new JsonArray();
    array.add(new JsonPrimitive("1"));
    //output ["1"]

代替:

    JSONArray array = new JSONArray();
    array.put("1");

【讨论】:

    【解决方案2】:

    您收到500 错误的原因是您将响应发送为text\plain,正如服务器所期望的application\json 一样。

    按照here 的建议,要发送原始 JSON,您需要使用 RequestBody 并传递它而不是 String

    RequestBody body = new RequestBody.create(MediaType.parse("application/json"),"[\"1\"]");
    
    retrofitService2.closeDoor("3bf11f14e6094dd5a8f31f6d6fac8f3d",body).enqueue(...)
    

    并将您的改造方法更改为

    @PUT("/{id}/update/D12")
    Call<String> closeDoor(@Path("id") String id, @Body RequestBody body);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      相关资源
      最近更新 更多