【问题标题】:Trying to POST with no body using Retrofit failing with GSON parsing exception尝试使用 Retrofit 在没有正文的情况下 POST 失败并出现 GSON 解析异常
【发布时间】:2014-03-04 05:32:54
【问题描述】:

我正在与 REST API 集成,因此我正在使用 Retrofit。我需要点击的网址是:

http://{{server}}/api/v1/stuff/{{id}}/deactivate

我已经创建了一个实现 API 的接口:

@PUT("/api/v1/stuff/{id}/deactivate")
String deactivate(@Path("id") String id);

问题是当我调用该方法时它失败并显示以下堆栈跟踪:

E/AndroidRuntime( 3046): Caused by: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 15  
E/AndroidRuntime( 3046):        at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:67)    
E/AndroidRuntime( 3046):        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:393) 
E/AndroidRuntime( 3046):        ... 11 more 
E/AndroidRuntime( 3046): Caused by: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 15   
E/AndroidRuntime( 3046):        at com.google.gson.Gson.assertFullConsumption(Gson.java:779) 
E/AndroidRuntime( 3046):        at com.google.gson.Gson.fromJson(Gson.java:769)   
E/AndroidRuntime( 3046):  at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63) 
E/AndroidRuntime( 3046):        ... 12 more 
E/AndroidRuntime( 3046): Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 15 
E/AndroidRuntime( 3046):        at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1505) 
E/AndroidRuntime( 3046):        at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1386) 
E/AndroidRuntime( 3046):        at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:531) 
E/AndroidRuntime( 3046):        at com.google.gson.stream.JsonReader.peek(JsonReader.java:414) 
E/AndroidRuntime( 3046):        at com.google.gson.Gson.assertFullConsumption(Gson.java:775) 
E/AndroidRuntime( 3046):        ... 14 more

我认为这是因为我没有在正文中发布任何内容。解决此问题的最佳方法是什么?

注意:我已经成功使用 POSTMan 调用 API。

【问题讨论】:

  • 我无法重现这个。你能写一个小样本吗?这是我使用的:gist.github.com/JakeWharton/5a0b1608ec728aa21c27
  • 感谢您回复@JakeWharton。我在周末发现这是 Web 服务没有将有效的 JSON 传递回客户端。很抱歉浪费了您的时间。

标签: android gson retrofit


【解决方案1】:

使用以下命令开启全面调试:

setLogLevel(RestAdapter.LogLevel.FULL)

发现 Gson 解析错误是因为从服务器返回的 JSON 格式不正确。我与服务器人员进行了“交谈”以修复它。

对不起,空虚的身体把想法放在了红鲱鱼上。我想我忘记了相关性并不表示因果关系。

【讨论】:

    【解决方案2】:

    我在改装时遇到了这个问题。我最初有以下内容:

    @POST("/item/{id}")
    void postItem(@Path("id") int id, Callback<String> callback);
    

    这给了我一个 okhttp 的例外。我将其更改为以下内容:

    @POST("/item/{id}")
    void postItem(@Path("id") int id, @Body String body, Callback<String> callback);
    

    然后这样处理:

    service.postItem(id, "", callback);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 2019-11-23
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 2018-02-13
      相关资源
      最近更新 更多