混淆发送json作为参数

时间:2017-04-20 18:54:01

标签: java json http-post

我在下面的java程序中打印了一个json字符串。

System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(objectsToSerialise));

我尝试使用以下代码行找到objectsToSerialise的类型。

    System.out.println(objectsToSerialise.getClass().getTypeName());

这返回了java.util.ArrayList

我得到的输出如下。

[ {
  "EntityLabels" : [ {
    "StartToken" : 8,
    "EntityType" : "Personname",
    "EndToken" : 16
  }, {
    "StartToken" : 24,
    "EntityType" : "Amount::Spent",
    "EndToken" : 31
  } ],
  "ExampleText" : "What is Frede's limit? ",
  "SelectedIntentName" : "GiftLimit"
} ]

我正在尝试将相同的内容发布到我的API中。代码如下。

luisUrl ="https://westus.api.cognitive.microsoft.com"

HttpPost httpPost = new HttpPost(luisUrl + "/luis/v1.0/prog/apps/" + appId + "/examples?");
httpPost.setHeader("Ocp-Apim-Subscription-Key", subsriptionId);
StringEntity params = new StringEntity(objectsToSerialise.toString());
httpPost.setHeader("Content-Type", "application/json");
httpPost.setEntity(params);
HttpResponse response = httpclient.execute(httpPost);
        /* Debug Info */
System.out.println("---------------Start2----------------");
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");
System.out.println(responseString);
System.out.println("---------------End----------------");
        /*End Debug Info*/
if (response.getStatusLine().getStatusCode() == 201) {
        success = true;
        System.out.println("Success");
} else {
        System.out.println("Block");
        success = false;
}

这始终是打印else内容。即Block。我认为这可能是我的电话问题,并在Postman中尝试了同样的问题。以下详细信息。

URL:吗 https://westus.api.cognitive.microsoft.com/luis/v1.0/prog/apps/ {APPID} /实例

方法:发布

接头

Content-Type:application/json
Ocp-Apim-Subscription-Key:{mySubscriptionKey}

身体:** RAW-> JSON **内容:

[ {
  "EntityLabels" : [ {
    "StartToken" : 8,
    "EntityType" : "Personname",
    "EndToken" : 16
  }, {
    "StartToken" : 24,
    "EntityType" : "Amount::Spent",
    "EndToken" : 31
  } ],
  "ExampleText" : "What is Frede's limit? ",
  "SelectedIntentName" : "GiftLimit"
} ]

令我惊讶的是,当我发布此消息时,它返回给我201,我的Java代码正在返回400

这非常令人困惑。请告诉我哪里出错了,我该如何解决这个问题。

由于

1 个答案:

答案 0 :(得分:2)

objectsToSerialize似乎是ArrayList,但在您的代码中,您使用new StringEntity(objectsToSerialise.toString());构建了请求正文。也就是说,您不能将ArrayList转换为JSON,而是通常会获得通常不是JSON的字符串表示形式。

尝试更改

new StringEntity(objectsToSerialise.toString());

new StringEntity(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(objectsToSerialise));