我正在使用改装设置一个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);
}
您必须将接口类传递给重启适配器的方法。假设您的接口类是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);
}
我也有同样的问题,看起来Gson对要转换的对象的双大括号初始化不满意。
正在替换双大括号初始化。。。
AuthenticationRequest req = new AuthenticationRequest() {{
setName("myName");
setPassword("myPass");
}}
与...
AuthenticationRequest req = new AuthenticationRequest();
req.setUserId("myName");
req.setPassword("myPass");
...成功了。
我怀疑根本原因是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并且结果应该是 问题答案: 通过将其包装在空字符串中来转换值