2015-09-02 3 views
1

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

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"} 

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

ответ

1

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

 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); 
     } 
+0

Это совершенно нормально, чтобы принять правильный ответ, даже если это ты (ОП), который ответил. Таким образом, для будущих посетителей гораздо понятнее, что это правильное решение. – fvu

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