2016-04-24 6 views
1

Ich weiß, die Frage ist seltsam. Leider habe ich einen Service, der alles zu haben, den Header ContentType=application/x-www-form-urlencoded erfordert, obwohl der Körper JSON istSend JSON Körper aber mit ContentType = Anwendung/x-www-Form-urlencoded mit ClientBuilder

Ich versuche, JAX-RS zu verwenden 2.0 ClientBuilder es zu nennen:

String baseUrl = "http://api.example.com/"; 

JSONObject body = new JSONObject(); 
body.put("key", "value"); 

Client client = ClientBuilder.newClient(); 
client.register(new LoggingFilter()); 
Builder builder = client.target(baseUrl).path("something").request(); 

Invocation inv = builder 
    .header("Content-type", MediaType.APPLICATION_FORM_URLENCODED) 
    .buildPost(Entity.json(body)); 
Response response = inv.invoke(); 

int status = response.getStatus(); 
// I get 415, unsupported media type (in this case is unexpected) 

Ich habe meine Protokolle geprüft und ich eventhough ich gründe application/x-www-form-urlencoded (über die MediaType) Antrag appearantly hat die Content-type von application/json

Wie kann ich die Anfrage zwingen, die Content-type ich möchte zu haben?


BTW: Das ist mein benutzerdefinierter Logger:

public class LoggingFilter implements ClientRequestFilter { 
    private static final Logger LOG = Logger.getLogger(LoggingFilter.class.getName()); 

    @Override 
    public void filter(ClientRequestContext requestContext) throws IOException { 
     LOG.log(Level.INFO, "body"); 
     LOG.log(Level.INFO, requestContext.getEntity().toString()); 
     LOG.log(Level.INFO, "headers"); 
     LOG.log(Level.INFO, requestContext.getHeaders().toString()); 
    } 
} 

Und das sind die Protokolle erhalte ich:

com.acme.LoggingFilter     I body 
com.acme.LoggingFilter     I {"key":"value"} 
com.acme.LoggingFilter     I headers 
com.acme.LoggingFilter     I {Content-type=[application/json]} 
+2

Ah, ok, benutze einfach 'Entity.entity ("{..}", MediaType.APPLICATION_FORM ...) '. Ich denke, das sollte funktionieren. –

Antwort

1

Das Problem mit dem Versuch, eine der statischen Entity Hilfsmethoden zu verwenden ist dass es überschreibt alle vorherigen Content-Type Header, die Sie möglicherweise festgelegt haben. In Ihrem aktuellen Fall setzt Entity.json den Header automatisch auf application/json.

Anstatt die Methode .json zu verwenden, können Sie einfach die allgemeine Methode Entity.entity(Object, MediaType) verwenden. Mit Ihrem aktuellen Fall können Sie jedoch nur Entity.entity(body, MediaType.APPLICATION_FORM_URLENCODED_TYPE) tun. Der Grund ist, dass der Client nach einem Provider sucht, der eine JSONObject zu application/x-www-form-urlencoded Daten serialisieren kann, die es keine gibt. Also müssen Sie es zuerst zu einem String serialisieren. Auf diese Weise muss der Provider, der application/x-www-form-urlencoded verarbeitet, nichts serialisieren. Also einfach

Entity.entity(body.toString(), MediaType.APPLICATION_FORM_URLENCODED_TYPE); 
Verwandte Themen