POST с телом JSON, используемым RESTeasy - HTTP 100 - PullRequest
3 голосов
/ 29 марта 2012

У меня очень простой сценарий, который я не могу заставить работать. Я пытаюсь отправить строку JSON в конец RESTful, используя cURL для отправки запроса по HTTPS и RESTeasy на сервер.

Мой cURL POST настроен следующим образом:

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

И получатель RESTeasy выглядит так:

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

Эта проблема, с которой я столкнулся, заключается в том, что запрос зависает примерно на 30 секунд, а затем возвращает ответ HTTP 100. Я понимаю, что HTTP 100 означает продолжить с оставшейся части запроса, но я не понимаю, как я должен это сделать.

Я попытался удалить заголовок Content-Length, но, очевидно, я получил 411 (нужна длина контента), так что это тоже не вариант.

Возможно, это проблема с типом контента? Любая помощь очень ценится.

1 Ответ

2 голосов
/ 30 марта 2012

Хорошо, так что благодаря предложениям @cbuckley и @ abraham в их комментариях я смог разобраться с этими проблемами. Вот что мне нужно было сделать:

1-> Измените содержимое тела POST, чтобы вместо curl_setopt($ch, CURLOPT_POSTFIELDS, array('json' => $content)); у меня теперь было curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($validJsonString));

2-> Я создал пользовательский @Provider, который анализировал строку JSON в Java POJO с такой же структурой:

@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-> Наконец, структура метода получателя должна немного измениться:

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

И это все хорошо прошло.

...