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

Retrofit POST包含null正文

连厉刚
2023-03-14

我正在使用改装设置一个api客户端,到目前为止,GET工作正常,但我正在尝试使用POST创建一个新对象,而不是将对象作为json发送,请求正文只包含字符串“null”:

---> HTTP POST http://myapiurl
Content-Type: application/json; charset=UTF-8
Content-Length: 4
null
---> END HTTP (4-byte body)

下面是我尝试调用的方法:

@POST("/Monsters/")
Response new_monster(@Body Monster mon);

我这样称呼它:

@Test
public void testNew_monster() throws Exception {
    //create a new monster object, and pass it to the function,
    //then query and verify it's in the results?
    Monster newmon = new Monster() {
        {
            name = "deleteme";
            description = "created by junit test testNew_monster";
            image_url = "http://i.imgur.com/";
            created_by = "";
            encoded_key = "";
        }
    };

    Response r = client.new_monster(newmon);
    assertEquals(201, r.getStatus());
    //sleep a couple seconds here?

    List<Monster> monsterList = client.monsters();
    assertTrue(monsterList.contains(newmon));
}

我猜当对象使用GSON序列化为json时出了问题,但在序列化过程中我看不到任何对调试器有帮助的东西......

我使用的是GSON版本2.3.1

编辑:以下是我如何构建RestAdapter和客户端:

static MonSpottingApi GetClient(boolean dbg)
{
    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(API_URL)
            .build();

    if (dbg) restAdapter.setLogLevel(RestAdapter.LogLevel.FULL);

    MonSpottingApi client = restAdapter.create(MonSpottingApi.class);

    return client;
}

测试用例类中:

MonSightingClient.MonSpottingApi client;

@Before
public void setUp() throws Exception {
    client = MonSightingClient.GetClient(true);
}

共有3个答案

严稳
2023-03-14

您必须将接口类传递给重启适配器的方法。假设您的接口类是INewService(其中声明了new\u monster),那么GetClient应该如下所示:

public static INewService GetClient(boolean dbg){

    RestAdapter restAdapter = new RestAdapter.Builder().
    .setEndpoint(API_URL).
    .setClient(new OkClient(new OkHttpClient()))
    .build();

    if (dbg) restAdapter.setLogLevel(RestAdapter.LogLevel.FULL);

    return restAdapter.create(INewService.class);
}
单于高逸
2023-03-14

我也有同样的问题,看起来Gson对要转换的对象的双大括号初始化不满意。

正在替换双大括号初始化。。。

 AuthenticationRequest req = new AuthenticationRequest() {{
     setName("myName"); 
     setPassword("myPass");
 }}

与...

AuthenticationRequest req = new AuthenticationRequest();
req.setUserId("myName");
req.setPassword("myPass");

...成功了。

蓝华皓
2023-03-14

我怀疑根本原因是Gson,所以我开始进行非常简单的测试,并尝试使用toJson()使对象正确序列化。我想我在Gson中发现了一个bug,如果使用双括号语法初始化对象,它就会失败:

使用这里找到的示例类

public class GitHubTest {

    //fails
    @Test
    public void testGson1() throws Exception {
        GitHubClient.Contributor contrib = new GitHubClient.Contributor() {
            {
                login = "someguy";
                contributions = 99;
            }
        };
        Gson gson = new Gson();
        String json = gson.toJson(contrib);
        System.out.println("contents of json string: " + json);
        assertNotEquals(json, "null");
    }

    //passes
    @Test
    public void testGson2() throws Exception {
        GitHubClient.Contributor contrib = new GitHubClient.Contributor();
        contrib.contributions = 99;
        contrib.login = "someguy";
        Gson gson = new Gson();
        String json = gson.toJson(contrib);
        System.out.println("contents of json string: " + json);
        assertNotEquals(json, "null");
    }
}

这是Gson中的错误吗?还是有一些奇怪的微妙Java原因导致这种情况发生?(Java不是我最强的语言)。

 类似资料:
  • 我需要一些“包含”和“不包含”的正则表达式。通常我会写: 包含:(.*WORD_A.*)$,不包含:(^((?!WORD_A.*)*)$ 如果单独使用,这很好,但我想写一些可以检测到的东西,比如“包含单词A和单词B”(顺序不相关!)和“包含单词A,但不包含单词B)。 基本上,我希望用户可以做出这样的声明“以单词a开头,包含单词B,但不是C和/或以D结尾”,程序返回真/假。最好的办法是只附加正则表达

  • 在以前的贴子上找不到解决方案,所以在这里。 有一个JavaMail(1.4.4版)服务。 我传递一个“to”电子邮件地址,如下所示:“fred@domain1.com,alice@domain2.com”。在一个应用程序中,这工作得很好,正如预期的那样,但是在这个服务中的代码是相同的,下面的代码行是: 给出此异常: 我尝试使用(严格的,错误的)smtp头,但没有帮助。 我还尝试了另一种添加多个收件

  • 将从非null元素返回最小值。 我想编写一个查询,将NULL视为可能的最小值。 我见过使用特殊值的日期技巧,如下所示:https://stackoverflow.com/a/32240382/7810882 但是,如果列的类型是并且没有可以映射到的特殊值怎么办?

  • 我有以下数据在我的表"设备" 我执行了下面的查询 它返回下面给出的结果 如何解决这个问题,让它忽略NULL,结果应该是

  • 问题内容: 在访问中,我一直试图在子窗体(检查清单)上显示的内容上设置用户过滤器。我尝试过研究的其他方法没有起作用,但是我成功使用了下面的代码,如果用户填写其他任何过滤器选项,它将进行过滤。我能弄清楚的是如何让它接受多个过滤器,除非我阐明了每种可能的组合框 因此,无论如何,这实际上是可能的,还是我需要看看其他选择? 实际上,如果表单过滤器不为空,有没有一种简单的方法可以包含条件 问题答案: 如果我

  • 问题内容: 我的“设备”表中有以下数据 我执行以下查询 返回下面给出的结果 如何得出这一点,以便它应该忽略NULL并且结果应该是 问题答案: 通过将其包装在空字符串中来转换值