2012-07-22 12 views
2

Pour une affectation, je dois créer un programme qui utilise le repos. C'est le code qui m'a été donné par l'enseignant pour nous aider à commencer cette tâche, donc ce code ci-dessous devrait être correct.Utilisation de curl avec un programme Java

import java.io.*; 
import java.net.InetSocketAddress; 
import java.util.*; 
import java.util.concurrent.Executors; 

import com.sun.net.httpserver.*; 

public class HttpServerDemo { 
    public static void main(String[] args) throws IOException { 
     InetSocketAddress addr = new InetSocketAddress(8080); 
     HttpServer server = HttpServer.create(addr, 0); 
     server.createContext("/", new RootHandler()); 
     server.createContext("/foo/", new FooHandler()); 
     server.setExecutor(Executors.newCachedThreadPool()); 
     server.start(); 
     System.out.println("Server is listening on port 8080"); 
    } 

    public static void printHeaders(HttpExchange exchange, PrintStream response) { 
     Headers requestHeaders = exchange.getRequestHeaders(); 
     Set<String> keySet = requestHeaders.keySet(); 
     Iterator<String> iter = keySet.iterator(); 
     while(iter.hasNext()) { 
      String key = iter.next(); 
      response.println(key + " = " + requestHeaders.get(key)); 
     } 
    } 
    public static void printBody(HttpExchange exchange, PrintStream response) throws IOException { 
     BufferedReader body = new BufferedReader(new InputStreamReader(exchange.getRequestBody())); 
     String bodyLine; 
     while((bodyLine = body.readLine()) != null) { 
      response.println(bodyLine); 
     } 
    } 
} 

class RootHandler implements HttpHandler { 
    public void handle(HttpExchange exchange) throws IOException { 
     String requestMethod = exchange.getRequestMethod(); 

     Headers responseHeaders = exchange.getResponseHeaders(); 
     responseHeaders.set("Content-Type", "text/plain"); 
     exchange.sendResponseHeaders(200, 0); 

     PrintStream response = new PrintStream(exchange.getResponseBody()); 
     response.println("context: ROOT; method: " + requestMethod); 
     response.println("--- headers ---"); 
     HttpServerDemo.printHeaders(exchange, response); 
     if(requestMethod.equalsIgnoreCase("POST")) { 
      response.println("=== body ==="); 
      HttpServerDemo.printBody(exchange, response); 
     } 
     response.close(); 
    } 
} 

class FooHandler implements HttpHandler { 
    public void handle(HttpExchange exchange) throws IOException { 
     String requestMethod = exchange.getRequestMethod(); 

     Headers responseHeaders = exchange.getResponseHeaders(); 
     responseHeaders.set("Content-Type", "text/plain"); 
     exchange.sendResponseHeaders(200, 0); 

     PrintStream response = new PrintStream(exchange.getResponseBody()); 
     response.println("context: FOO; method: " + requestMethod); 
     HttpServerDemo.printHeaders(exchange, response); 
     response.close(); 
    } 
} 

Depuis la classe RootHandler a une instruction if pour la vérification « POST » Je vais l'utiliser pour le tester. Alors, quand je CURL à partir d'un terminal séparé pour communiquer avec ce programme, je rentre:

curl –d "message=helloworld" http://localhost:8080/ 

et je reçois ce en retour:

curl: (6) Could not resolve host: –d; nodename nor servname provided, or not known 
curl: (6) Could not resolve host: message=helloworld; nodename nor servname provided, or not known 
context: ROOT; method: GET 
--- headers --- 
Host = [localhost:8080] 
User-agent = [curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5] 
Accept = [*/*] 

Je sens que je fais mon erreur quand je me sers boucle de mon terminal. En regardant les erreurs, il ne prend pas l'option "-d" que je lui donne et il amène le programme à lire la méthode de requête comme "GET" au lieu de "POST". J'ai essayé ceci pour les méthodes de demande "DELETE" et "PUT" et j'ai obtenu le même résultat.

Répondre

1

Ce n'est pas un tiret:

curl –d "message=helloworld" http://localhost:8080/ # Not a dash 
curl -d "message=helloworld" http://localhost:8080/ # Is a dash 

Il doit être clair que le code est complètement hors de propos, puisque l'erreur que vous obtenez est de curl.

Bien que le code devrait avoir raison, cela ne signifie pas qu'il est . Ne croyez pas cela uniquement parce que vous l'avez reçu d'un enseignant, d'un livre, d'un site Web, etc. Toutes sortes de problèmes peuvent survenir, comme le copier-coller, ce qui est probablement le cas avec votre commande curl.

+0

Wow bien sûr mon erreur serait quelque chose aussi simple que cela. Merci! – user1513200

+0

@ user1513200 Alors que je m'en doutais depuis le début, vous pouvez également utiliser le processus d'élimination: curl localhost, curl localhost: 8080, etc. jusqu'à ce que quelque chose se brise. Si rien ne casse au fur et à mesure que vous le saisissez, faites un copier/coller suspect. Essayez avec des données différentes. Sanity-vérifier les options. –

0
curl: (6) Could not resolve host: –d; nodename nor servname provided, or not known 
curl: (6) Could not resolve host: message=helloworld; nodename nor servname provided, or not known 

Ce sont des erreurs de boucle, non causées par l'hôte distant. Après avoir étudié votre demande de roulage, vous utilisez le mauvais caractère "-".

Vous utilisez -d lorsque l'option réelle est -d.

Voyez comment la taille est différente:

  • -d < - mauvais
  • -d < - correct
Questions connexes