Вызов RESTful WS через API рестлета

1

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

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 может быть, вы пропустите / ?
Показать ещё 5 комментариев
Теги:
web-services
restlet

1 ответ

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 и request application / www-form. После внесенных вами изменений я получаю исключение http 500 (хотя это исключение сопоставлено с NPE в org.restlet.resource.ServerResource.doHandle (ServerResource.java:517)
  • 0
    Спасибо за дополнительные советы о вашей проблеме! Можем ли мы дать мне ту версию Restlet, которую вы используете? Так что я смогу сделать больше тестов, чтобы воспроизвести вашу проблему ;-)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню