2017-02-03 2 views
1

У меня есть приложение Tomcat, которое имеет службу RESTService. @Get отлично работает и отвечает на правильные объекты json. Проблема при попытке реализовать @post службы JSon, я всегда получаю плохую ошибку запроса 400.Плохой запрос на json POST с использованием Tomcat

В конце концов, моя purpouse это загрузить и объект типа программы

public class Program { 

private long start; 
private long stop; 
private double temperature; 

public Program(long start, long stop, double temperature) { 
    this.start = start; 
    this.stop = stop; 
    this.temperature = temperature; 
} 
} 

Это JSON Я хочу загрузить:

{ 
    "stop":1486119421283, 
    "start":1486119421283, 
    "temperature":2 
} 

Вот мой код:

@POST 
@Path("/program") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response crunchifyREST(InputStream incomingData) { 
    StringBuilder crunchifyBuilder = new StringBuilder(); 
    try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(incomingData)); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
      crunchifyBuilder.append(line); 
     } 
    } catch (Exception e) { 
     logger.error("Error Parsing: - "); 
    } 
    logger.debug("Data Received: " + crunchifyBuilder.toString()); 

    // return HTTP response 200 in case of success 
    return Response.status(200).entity(crunchifyBuilder.toString()).build(); 
} 

и это Maven зависимостей

<?xml version="1.0" encoding="UTF-8"?> 

http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

<groupId>home</groupId> 
<artifactId>CTemp</artifactId> 
<version>1.0</version> 
<packaging>war</packaging> 

<name>CTemp</name> 

<properties> 
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

<dependencies> 

    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
     <version>2.9.7</version> 
    </dependency> 

    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.1.7</version> 
    </dependency> 

    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>1.1.7</version> 
    </dependency> 

    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.21</version> 
    </dependency> 

    <dependency> 
     <groupId>com.pi4j</groupId> 
     <artifactId>pi4j-core</artifactId> 
     <version>1.0</version> 
    </dependency> 

    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>7.0</version> 
     <scope>provided</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20160212</version> 
     <type>jar</type> 
    </dependency> 

    <!-->  REST DEPENDENCIES --> 

    <dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0.1</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.hk2.external</groupId> 
     <artifactId>asm-all-repackaged</artifactId> 
     <version>2.2.0-b14</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.core</groupId> 
     <artifactId>jersey-client</artifactId> 
     <version>2.25</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.core</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>2.25</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.core</groupId> 
     <artifactId>jersey-common</artifactId> 
     <version>2.25</version> 
    </dependency> 

    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>3.2.4</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.persistence</groupId> 
     <artifactId>persistence-api</artifactId> 
     <version>1.0.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet</artifactId> 
     <version>2.25</version> 
    </dependency> 

</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <compilerArguments> 
        <endorseddirs>${endorsed.dir}</endorseddirs> 
       </compilerArguments> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.6</version> 
      <executions> 
       <execution> 
        <phase>validate</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${endorsed.dir}</outputDirectory> 
         <silent>true</silent> 
         <artifactItems> 
          <artifactItem> 
           <groupId>javax</groupId> 
           <artifactId>javaee-endorsed-api</artifactId> 
           <version>7.0</version> 
           <type>jar</type> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    <finalName>CTemp</finalName> 
</build> 

+0

Вы отправляете объект json и ожидаете входной поток, поэтому обязательно получите ошибку. Просто измените ввод на JsonNode/Program Object, например: crunchifyREST (Program program) или crunchifyREST (данные JsonNode) – user1211

+0

Я изменил его, но то же самое произойдет – Toni

+0

Json Значения должны быть в этом формате { "stop": "1486119421283", " start ":" 1486119421283 ", " температура ":" 2 " } – AnilCk

ответ

-3

Запрос был уродлив, поэтому вы получили 400 ошибок. Вам нужны двойные кавычки в значениях. Джейсон работает со строками, поэтому просто измените свой код. Ниже приведен пример:

{ 
    "one": "1:1", 
    "two": { 
    "three": "3:3" 
    } 
} 
+0

Числа в формате JSON не нужны кавычки: '{ \t "anInteger": 42, \t "наплаву": 2,4 }' действует JSON. – slim

+0

Также программа Toni не делает ничего JSON-y со входом, поэтому искаженный JSON не вызовет ошибки 400. – slim

0

Ваш код работает нормально. (У него есть некоторые незначительные недостатки, которые вы увидите, если обратите внимание на предупреждения компилятора/IDE). Я скопировал его в проект Tomcat/Джексон и попытался его:

$ curl -H "Content-Type: application/json" \ 
    -X POST \ 
    -d '{ "stop":1486119421283, "start":1486119421283, "temperature":2 }' \ 
    http://localhost:8080/myproject/program 
{ "stop":1486119421283, "start":1486119421283, "temperature":2 } 

Вы, вероятно, отправив запрос плохой (так же, как сообщение об ошибке говорит вам). Мы не можем догадаться, что это будет, не видя, как вы отправляете запрос.

Я пытался посылать неверный тип содержимого, и получил 415, а не 400:

$ curl -f -H "Content-Type: text/plain" \ 
    -X POST \ 
    -d '{ "stop":1486119421283, "start":1486119421283, "temperature":2 }' \ 
    http://localhost:8080/myproject/program 
curl: (22) The requested URL returned error: 415 Unsupported Media Type 

Заметьте, что, потому что вы на самом деле не делает никакой обработки JSON, это не имеет значения на данном этапе ли тело на самом деле JSON:

$ curl -H "Content-Type: application/json" \ 
    -X POST \ 
    -d 'Not actually JSON' \ 
    http://localhost:8080/myproject/program 
Not actually JSON 
Смежные вопросы