2017-02-03 2 views
1

Ich habe eine Tomcat-App, die RESTService hat. @Get funktioniert einwandfrei und reagiert auf richtige JSON-Objekte. Das Problem ist, wenn @Post json Service zu implementieren versuchen, habe ich immer schlecht Anforderungsfehler immer am 400.Schlechte Anfrage auf Json POST mit Tomcat

Immerhin mein purpouse ist und vom Typ Programm-Objekt zu laden

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; 
} 
} 

Dies ist die json Ich möchte hochladen:

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

Hier ist mein Code:

@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(); 
} 

und diese sind Maven Abhängigkeiten

<?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

Sie senden JSON-Objekt und erwarten Eingabe-Stream, so gebunden, um Fehler zu bekommen. Ändern Sie einfach die Eingabe in JsonNode/Program Object zB: crunchifyREST (Programm Programm) oder crunchifyREST (JsonNode Daten) – user1211

+0

Ich habe es geändert, aber das selbe passiert – Toni

+0

Json Werte sollten in diesem Format sein { "stop": "1486119421283", " start ":" 1486119421283 ", " temperature ":" 2 " } – AnilCk

Antwort

-3

Der Antrag war fehlerhaft, Du hast also 400 Fehler. Sie benötigen die Anführungszeichen in den Werten. Jason arbeitet mit Strings, also ändere einfach deinen Code. Unter einem Beispiel:

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

Zahlen in JSON keine Anführungszeichen brauchen: '{ \t "anInteger": 42, \t "aFloat": 2.4 }' ist gültig JSON. – slim

+0

Auch Toni's Programm macht nichts JSON-y mit der Eingabe, also würde ein fehlerhafter JSON keinen 400 Fehler verursachen. – slim

0

Ihr Code funktioniert gut. (Es hat einige kleinere Fehler, die Sie sehen werden, wenn Sie auf Compiler/IDE-Warnungen achten). Ich kopierte sie in einen Tomcat/Jackson Projekt und versuchte es aus:

$ 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 } 

Sie sind wahrscheinlich eine schlechte Anfrage zu senden (wie die Fehlermeldung sagt Ihnen). Wir können nicht erraten, was das wäre, ohne zu sehen, wie Sie die Anfrage senden.

Ich habe versucht, einen ungültigen Content-Typen zu senden, und bekam ein 415, keine 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 

Beachten Sie, dass, weil Sie eigentlich keine JSON Verarbeitung zu tun, ist es in diesem Stadium, ob der Körper irrelevant ist eigentlich JSON:

$ curl -H "Content-Type: application/json" \ 
    -X POST \ 
    -d 'Not actually JSON' \ 
    http://localhost:8080/myproject/program 
Not actually JSON