2016-07-31 4 views
3

J'ai un serveur java echo httpserver en place.Définition du type de contenu dans la réponse Java HttpServer

Cela fonctionne avec les sites de test, mais le code client avec lequel je travaille n'obtient pas les données.

Le serveur fonctionne parfaitement avec https://www.hurl.it/

Le client fonctionne parfaitement avec https://requestb.in/ et http://httpbin.org/post

En combinant les deux je reçois une réponse avec un code d'état de 200, mais pas de métadonnées/contenu du corps apparaît dans le client même si c'est envoyé. Ma seule supposition est parce que le type de contenu n'est pas inclus, le client peut être pointilleux à ce sujet.

Comment puis-je spécifier le type de contenu dans ma réponse?

(Une note, le client envoie une seule chaîne au serveur avec un POST comme paramètre avec quelques informations d'en-tête. Ce code est actuellement configuré pour ne renvoyer le contenu corps/paramètre.)

Toutes les idées apprécié!

import static java.net.HttpURLConnection.HTTP_OK; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.InetSocketAddress; 
import java.net.URLDecoder; 
import java.util.List; 

import com.sun.net.httpserver.Headers; 
import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; 

/** 
* Echo the body of an HTTP request back as the HTTP response. This is merely 
* a simple exercise of the Secret Sun Web Server. As configured, the URL to 
* access it is http://localhost:8000/echo. 
* 
* @author Andrew Cowie 
*/ 
public final class Test 
{ 
public static void main(String[] args) throws IOException { 
    final InetSocketAddress addr; 
    final HttpServer server; 

    addr = new InetSocketAddress(8000); 

    server = HttpServer.create(addr, 10); 
    server.createContext("/echo", new EchoHandler()); 
    server.start(); 
} 
} 

class EchoHandler implements HttpHandler 
{ 
public void handle(HttpExchange t) throws IOException { 
    final InputStream is; 
    final OutputStream os; 
    StringBuilder buf; 
    int b; 
    final String request, response; 

    buf = new StringBuilder(); 

    /* 
    * Get the request body and decode it. Regardless of what you are 
    * actually doing, it is apparently considered correct form to consume 
    * all the bytes from the InputStream. If you don't, closing the 
    * OutputStream will cause that to occur 
    */ 

    is = t.getRequestBody(); 

    while ((b = is.read()) != -1) { 
     buf.append((char) b); 
    } 

    is.close(); 

    if (buf.length() > 0) { 
     request = URLDecoder.decode(buf.toString(), "UTF-8"); 
    } else { 
     request = null; 
    } 

    /* 
    * Construct our response: 
    */ 

    buf = new StringBuilder(); 
    //buf.append("<html><head><title>HTTP echo server</title></head><body>"); 
    //buf.append("<p><pre>"); 
    //buf.append(t.getRequestMethod() + " " + t.getRequestURI() + " " + t.getProtocol() + "\n"); 

    /* 
    * Process the request headers. This is a bit involved due to the 
    * complexity arising from the fact that headers can be repeated. 
    */ 

    Headers headers = t.getRequestHeaders(); 

    for (String name : headers.keySet()) { 
     List<String> values = headers.get(name); 

     for (String value : values) { 
      //buf.append(name + ": " + value + "\n"); 
     } 
    } 

    /* 
    * If there was an actual body to the request, add it: 
    */ 

    if (request != null) { 
     //buf.append("\n"); 
     buf.append(request); 
    } 

    //buf.append("</pre></p>"); 
    //buf.append("</body></html>\n"); 

    response = buf.toString(); 
    System.out.println(response); 

    /* 
    * And now send the response. We could have instead done this 
    * dynamically, using 0 as the response size (forcing chunked 
    * encoding) and writing the bytes of the response directly to the 
    * OutputStream, but building the String first allows us to know the 
    * exact length so we can send a response with a known size. Better :) 
    */ 

    t.sendResponseHeaders(HTTP_OK, response.length()); 

    os = t.getResponseBody(); 

    os.write(response.getBytes()); 

    /* 
    * And we're done! 
    */ 

    os.close(); 
    t.close(); 
} 

}

Répondre

3

Essayez d'ajouter

t.getResponseHeaders().put("Content-Type", "text/html"); 

avant d'écrire

+0

Dans mon cas, 'ajouter (.....) t.getResponseHeaders().' 'Avant sendResponseHeaders ' – asr