2015-01-29 3 views
1

Я пытаюсь вызвать WS из моего кода клиента (на основе Restlet), но я получаю исключение для плохого запроса (код состояния HTTP 400) в методе client.post.Вызов RESTful WS через API-интерфейс restlet

public static void main(String[] args) throws Exception{ 

    String serviceUrl = "http://localhost:8080/MPosBEService"+BeServicePath.MERCHANT_REGISTRATION; 
    //String serviceUrl = "http://192.168.101.124:8081/be"+BeServicePath.MERCHANT_REGISTRATION; 
    ClientResource client = new ClientResource(serviceUrl); 

    addHeaders(client); 

    objectMapper=new ObjectMapper(); 
    objectMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); 

    try{ 
     Form form = new Form(); 
     form.set("username", "intendanet"); 
     form.set("password", "1111"); 

     client.post(form, MediaType.APPLICATION_JSON);//**this line is the culprit** 

     //client.post(new MerchantRegisterRequestPojo("intendanet","1111"), MediaType.APPLICATION_JSON); 

    }catch(Exception e) 
    { 
     System.out.println(e.getLocalizedMessage()); 
     throw e; 
    } 

    Response response = client.getResponse(); 

    if(response.getStatus().getCode() == 200) 
    { 
     m = deserializeJson((HttpEntity)response.getEntity(), MerchantPojo.class); 
     System.out.println("Result:" + m.id); 
    }else { 
     System.out.println("Exception: "+ response.getStatus().getCode()); 

     throw new HttpStatusException(response.getStatus().getCode()); 
    } 
} 

static private void addHeaders(ClientResource client){ 

    client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_LANGUAGE_ID.toString(), "1"+""); 
    client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_APP_VERSION.toString(), "1"+""); 
    client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_GENERATED_ID.toString(), "flskdjf9ksmflskmfl"); 
    client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_INFO.toString(), "ovo je moj device!"); 

} 

static private <T> T deserializeJson(HttpEntity json, Class<T> targetType) throws Exception{ 
    return objectMapper.readValue(EntityUtils.toString(json), targetType); 
} 

Благодаря

+0

Расскажите нам больше о сервере. Какой запрос он ожидает? –

+0

Что такое содержимое 'BeServicePath.MERCHANT_REGISTRATION', может быть, вы пропустите'/'? – Jens

+0

Сервер Tomcat работает либо на 192.168.101.124 (удаленный сервер), либо на localhost. Я пробовал оба URL-адреса, но я получаю одинаковое исключение. Он ожидает получить тип mime приложения/x-www-form-urlencoded. –

ответ

1

Я не то, что ваша служба REST ожидает, но я вижу две потенциальные проблемы в коде.

Во-первых, заголовки неправильно настроены в вашем ответе. Вы должны обновить свой метод addHeaders, как описано ниже:

static private void addHeaders(ClientResource client){ 
    Series<Header> headers = (Series<Header>) cr.getRequestAttributes().get(
            "org.restlet.http.headers"); 
    if (headers==null) { 
     headers = new Series<Header>(Header.class); 
     cr.getRequestAttributes().put(
       "org.restlet.http.headers", headers); 
    } 

    headers.set(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_LANGUAGE_ID.toString(), "1"); 
    headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_APP_VERSION.toString(), "1"); 
    headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_GENERATED_ID.to String(), "flskdjf9ksmflskmfl"); 
    headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_INFO.toString(), "ovo je moj device!"); 
} 

Во-вторых, вы должны быть осторожны содержания отправляемой и связанного с ним типа носителя. Вы должны иметь что-то вроде этого:

// With form 
Form form = new Form(); 
form.set("username", "intendanet"); 
form.set("password", "1111"); 

client.post(form, MediaType.APPLICATION_FORM_URLENCODED); 

// With JSON 
JSONObject jsonObj = new JSONObject 
jsonObj.put("username", "intendanet"); 
jsonObj.put("password", "1111"); 
client.post(new JsonRepresentation(jsonObj)); 

Надеется, что это помогает, Тьерри

+0

Благодарим вас за предложение, но оно все еще не работает. Во-первых, мне пришлось использовать MediaType.APPLICATION_WWW_FORM (MediaType.APPLICATION_FORM_URLENCODED не может компилироваться). Во-вторых, в документах Restlet говорится, что второй параметр метода post обозначает тип mime ответа, а не тип запроса, а мой mime ответа должен быть application/json и запрашивать application/www-form. С внесенными вами изменениями я получаю исключение http 500 (хотя это исключение сопоставляется с NPE в org.restlet.resource.ServerResource.doHandle (ServerResource.java:517) –

+0

Спасибо за дополнительные подсказки о вашей проблеме! дайте мне версию Restlet, которую вы используете? Поэтому я смогу сделать больше тестов для воспроизведения вашей проблемы ;-) –

+0

Thierry, спасибо за вашу помощь. Теперь, на localhost, я получаю статус 204 (без содержимого), поэтому заголовки в порядке. Я переписал весь код с использованием API org.apache.http, и он работает нормально. Я получаю ответ json, как ожидалось. Когда я найду время, я сделаю еще несколько тестов с кодом восстановления. –

Смежные вопросы