Вход пользователя в Zabbix API с помощью клиента Jersey

Я пытаюсь войти в Zabbix, используя Zabbix API и клиент Jersey. это должно быть просто, это HTTP-запрос Post, с curl он выглядит так:

curl -i -X POST -H 'Content-Type: application/json-rpc' -d '{"jsonrpc":"2.0","method":"user.login","id":1,"params":{"user":"my_uname","password":"my_pass"}}' http://company_host/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Wed, 02 Sep 2015 18:06:51 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.3
Content-Length: 68
Content-Type: application/json

{"jsonrpc":"2.0","result":"53a3e46343b5d29eb11678be2775df9b","id":1}

В Java-коде я попытался использовать клиент Джерси:

    JSONObject mainJObj = new JSONObject();
    JSONObject paramJObj = new JSONObject();

    mainJObj.put("jsonrpc", "2.0");
    mainJObj.put("method", "user.login");
    mainJObj.put("id", "1");
    paramJObj.put("user", "my_uname");
    paramJObj.put("password", "my_pass");
    mainJObj.put("params", paramJObj);

    Client client = Client.create();
    WebResource webResource = client.resource("http://company_host/zabbix/api_jsonrpc.php");
    ClientResponse response = webResource.type("application/json").post(ClientResponse.class, mainJObj);

    if (response.getStatus() != 200) {
        throw new RuntimeIOException("Failed : HTTP error code: " + response.getStatus());
    }
    String token = response.getEntity(String.class);
    System.out.println("Authentication token: " + token);

ответ возвращает 200 OK, но объект всегда пуст.

затем я перешел на httpclient, он работал правильно:

        DefaultHttpClient httpClient = new DefaultHttpClient();    
        HttpPost postRequest = new HttpPost("http://company_host/zabbix/api_jsonrpc.php");
        StringEntity input = new StringEntity(mainJObj.toString());
        input.setContentType("application/json");
        postRequest.setEntity(input);

        HttpResponse response = httpClient.execute(postRequest);

        if (response.getStatusLine().getStatusCode() != 200) {
           throw new RuntimeException("Failed : HTTP error code : "
                   + response.getStatusLine().getStatusCode());
        }

        BufferedReader br = new BufferedReader(
                    new InputStreamReader((response.getEntity().getContent())));

        String output;
        System.out.println("Output from Server .... \n");
        while ((output = br.readLine()) != null) {
            System.out.println(output);
        }

он распечатывает ответ с сервера:

{"jsonrpc":"2.0","result":"53a3e46343b5d29eb11678be2775df9b","id":"1"}

почему клиент Джерси не может получить ответ от сервера?


person user468587    schedule 02.09.2015    source источник


Ответы (1)


наконец-то он заработал, нужно создать http-клиент apache и подключить его к клиенту jersey в качестве обработчика и проанализировать ответ как поток:

        HttpClient apacheClient = HttpClientBuilder.create().build();
        Client client = new Client(new ApacheHttpClient4Handler(apacheClient,
                new BasicCookieStore(),
                true));

        WebResource webResource = client.resource("http://comapany_host/zabbix/api_jsonrpc.php");
        ClientResponse response = webResource.type("application/json").post(ClientResponse.class, mainJObj);

        if (response.getStatus() != 200) {
            throw new RuntimeIOException("Failed : HTTP error code: " + response.getStatus());
        }

        BufferedReader br = new BufferedReader(
                new InputStreamReader((response.getEntityInputStream())));

        String output;
        System.out.println("Output from Server .... \n");
        while ((output = br.readLine()) != null) {
            System.out.println(output);
        }
person user468587    schedule 03.09.2015
comment
Совершенно нормально принять правильный ответ, даже если это вы (ОП) ответили. Так будущим посетителям будет намного яснее, что это правильное решение. - person fvu; 15.09.2015