2012-03-28 4 views
3

J'ai un scénario très simple que je ne peux pas travailler. J'essaye de POSTER une chaîne JSON à un endoint RESTful en utilisant cURL pour envoyer la demande sur HTTPS et RESTeasy sur le serveur.POST avec le corps JSON consommé par RESTeasy - HTTP 100

Mon Flexion est configuré ainsi:

$ch = curl_init(); 

$content = json_encode($validJsonString); 

curl_setopt($ch, CURLOPT_URL, 'https://foobar.com/test?trackingId=12345'); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('json' => $content)); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_HEADER, 0); 

$headers = array( 
    'Content-Type: application/json', 
    'Content-Length: ' . strlen($content) 
); 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$response = curl_exec ($ch); 

$httpResponseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

$json = json_decode($response); 
curl_close ($ch); 

return $json; 

Et le recipiant RESTeasy ressemble:

@POST 
@Path("/test") 
@Produces("application/json") 
public String addObjectCommentAsJSON( @FormParam("json") String validJsonString, 
             @QueryParam("trackingId") String trackingId) { 
    Gson gson = new Gson(); 
    SomeObject someObject = gson.fromJson(validJsonString, SomeObject.class); 
    String responseString = methodThatReturnsAJsonString(trackingId, someObject); 
    return responseString; 
} 

Cette question que j'ai est que la demande se bloque pendant environ 30 secondes, puis retourne une Réponse HTTP 100 Je comprends que HTTP 100 signifie continuer avec le reste de la demande, mais je ne comprends pas comment je suis censé faire cela.

J'ai essayé de supprimer l'en-tête Content-Length, mais évidemment, je reçois un 411 (nécessite la longueur du contenu) donc ce n'est pas une option non plus.

Est-ce un problème avec le type de contenu peut-être? Toute aide est très appréciée.

+0

Copie possible de http://stackoverflow.com/questions/4271621/php-curl-post-json – cmbuckley

+2

Selon php.net si vous passez un tableau à 'CURLOPT_POSTFIELDS' il est codé pour' multipart/form-data '. Que se passe-t-il si vous passez la chaîne json directement? – abraham

+0

@cbuckley J'ai vu ça mais il n'y a aucune mention de RESTeasy dans l'autre et c'est 50% du problème potentiel ici ... – travega

Répondre

2

Ok, donc grâce aux suggestions de @cbuckley et @ abraham dans leurs commentaires, j'ai pu résoudre les problèmes. Voilà ce que je devais faire:

1-> Modifier le contenu du corps POST donc au lieu de curl_setopt($ch, CURLOPT_POSTFIELDS, array('json' => $content)); J'ai maintenant curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($validJsonString));

2-> Je créé une coutume @Provider une chaîne qui parsé JSON à Java POJO avec la même structure:

@Provider 
public class SomeObjectProvider implements StringConverter<SomeObject> { 

    private final Gson gson = new Gson(); 
    public SomeObject fromString(String s) { 
     return gson.fromJson(s, SomeObject.class); 
    } 

    public String toString(SomeObject someObject) { 
     return gson.toJson(SomeObject); 
    } 
} 

3-> Enfin la structure de la méthode bénéficiaire doit changer légèrement:

@POST 
@Path("/test") 
@Produces("application/json") 
public String addObjectCommentAsJSON(SomeObject someObject, 
            @QueryParam("trackingId") String trackingId) { 
    String responseString = methodThatReturnsAJsonString(trackingId, someObject); 
    return responseString; 
} 

et que tous ont transité par bien.

Questions connexes