2013-04-02 3 views
1

У меня возникли проблемы с использованием Spring restTemplate.Restful Service in Spring приводит к 400 Bad request

Согласно документации API (ТОЛЬКО для PHP) службы Rest, которую я пытаюсь получить. Правильный формат POST являются:

curl -d "data={\"client_email\":\"[email protected]\",\"client_name\":\"Steve Ryner\",\"employee_id\":0,\"service_id\":20216,\"start_date\":\"2012-08-15 09:00:00\",\"note\":\"This is a test.\"}" http://www.setster.com/api/v2/company/7089/appointment?session_token=niab4ptf9mjjem41cooso389f3 

, чтобы получить этот ответ:

{ 
"statusCode":0, 
"statusDescription":"OK", 
"data":{ 
    "status":2, 
    "client_id":103352, 
    "client_email":"[email protected]", 
    "client_name":"Steve Ryner", 
    "company_id":"7089", 
    "employee_id":9862, 
    "location_id":"13832", 
    "start_date":"2012-08-15 14:00", 
    "end_date":"2012-08-15 15:00", 
    "length":3600000, 
    "note":"This is a test.", 
    "service_id":20216, 
    "type":"60 Min Swedish", 
    "duration_padding":0, 
    "repeat_type":0, 
    "subservices":"", 
    "timezone_dif":-18000, 
    "price":"60", 
    "custom_fields":"[]", 
    "client_phone":"", 
    "client_address":"", 
    "payment_pending":0, 
    "id":171302483 
} 

}

Вот важная часть моего кода:

RestTemplate restTemplate = new RestTemplate(); 

Map<String, String> data = new HashMap<String, String>(); 

     data.put("client_name", "Alexandre Moraes"); 
     data.put("client_email", "[email protected]"); 
     data.put("client_phone", "98065867"); 
     data.put("employee_id", "0"); 
     data.put("location_id", "16675"); // Here i have to specify the "Location_ID" because there is more than just one 
     data.put("start_date", "2013-05-03 09:15:00"); 
     data.put("service_id", "18499"); 

     String result = restTemplate.postForObject("http://setster.com/api/v2/company/6788/appointment/?session_token="+session_token, data, String.class); 

     resp.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = resp.getWriter(); 
     out.println(result); 

Но когда я исполняю что postForObject, ответ 400 Bad запрос, как будто что-то не так послал:

WARNING: POST request for "http://setster.com/api/v2/company/6788/appointment/?session_token=[censored]" resulted in 400 (Bad Request); invoking error handler 
WARNING: StandardWrapperValve[setster]: PWC1406: Servlet.service() for servlet setster threw exception 

Может быть формат я отправлял данные неверны. Но я не могу понять, как я могу управлять этой информацией.

У любого есть представление о том, что я делаю неправильно?

ответ

0

Использование Джексон Lib - это простой способ для преобразования объекта в JSON:

ObjectMapper mapper = new ObjectMapper();

mapper.writeValue(resp.getWriter(), data); 
+2

Вызов 'restTemplate.postForObject' не работает, а не ответ. –

1

В вашем завитка запросе, тело вашего HTTP POST является:

data={\"client_email\":\"[email protected]\",\"client_name\":\"Steve Ryner\",\"employee_id\":0,\"service_id\":20216,\"start_date\":\"2012-08-15 09:00:00\",\"note\":\"This is a test.\"} 

Так ваша конечная точка ожидает стандартный HTTP POST с одной строкой, называемой данными, с вашим сериализованным JSON. RestTemplate предполагает, что вы хотите, чтобы представить так:

{\"client_email\":\"[email protected]\",\"client_name\":\"Steve Ryner\",\"employee_id\":0,\"service_id\":20216,\"start_date\":\"2012-08-15 09:00:00\",\"note\":\"This is a test.\"} 

то есть, только объект JSON. Вы не сможете использовать RestTemplate для этого. Используйте один из Spring's built-ins для HTTP-сервисов.

+0

Спасибо за полезную информацию @ jordan002, на самом деле это первый раз, когда я вижу Java, и немного сложно понять некоторые вещи: ** 1. Что вы имеете в виду под «Spring Built-in для Http Services»? ** Извините. Я не так хорош на английском, так что, можете ли вы привести мне пример? Благодарю. – Alexandre

+0

Добавлена ​​ссылка на руководство по перемещению Spring. Надеюсь, это поможет. Если вы довольны ответом, вам будет признан прием или продвижение. –