2014-09-10 4 views
-1

Я использую RestTemplate для выполнения URL-адреса, а затем распечатываю код статуса http для него.Как получить счет каждого кода статуса HTTP эффективно?

ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null, String.class); 
System.out.println(response.getStatusCode()); 

Теперь то, что мне нужно сделать, это, мне нужно, чтобы получить количество каждого кода состояния и сохранить его на карте, как ключ и значение. Значение, сколько раз каждый код состояния подходит. Если код статуса http 200 приближается 100 раз, я бы хотел увидеть его.

Я могу сделать это, имея несколько временных переменных для каждого кода состояния и продолжая увеличивать счет соответственно. Но кроме этого есть ли другой простой способ сделать это?

ответ

1

Возможно, использовать Map? Со статусом как ключ и значение в качестве счетчика.

Map<String,Integer> counters = new HashMap<>(); 
... 
synchronized (counters) { 

    String code = response.getStatusCode(); 
    Integer counter = counters.get(code); 

    if (counter == null) { 
    counters.put(code, 1); 
    } else { 
    counters.put(code, counter + 1) 
    } 
} 
+0

Вот что я упомянул в своем вопросе. Я могу иметь несколько временных переменных в зависимости от количества кодов состояния Http, а затем продолжать увеличивать счетчик соответственно. Но есть ли другой простой способ. Это был мой вопрос. – john

+0

с 'Map' вы будете иметь только одну переменную temp. Я не думаю, что это будет проще. Я попытаюсь обновить свой ответ небольшим примером. –

0
Map<Integer,Integer> statusMap = new HashMap<Integer,Integer>(); 

public void store(int code) 
{ 
    if (statusMap.containsKey(code)) 
    { 
     int value = statusMap.get(code); 
     statusMap.put(code,value+1); 
    } 
    else 
    { 
     statusMap.put(code,1);  
    } 
} 

public void list() 
{ 
    Iterator<Integer> iter = statusMap.keySet().iterator(); 
    while(iter.hasNext()) 
    { 
     int code = iter.next(); 
     System.out.println(code + " : " + statusMap.get(code)); 
    } 
} 
0

Используйте HashMap, затем:

  • если ваш httpcode не был уже на карте, вставьте его со счетом = 1.
  • если ваш httpcode уже существуют в карту, затем увеличить счетчик

    HashMap<Integer, Integer> mapCount = new HashMap<Integer, Integer>(); 
    
    // ... 
    
    void updateMap(Integer httpCode) { 
        if (!mapCount.containsKey(httpCode)) { 
         mapCount.put(httpCode, 1); 
        } else { 
         // update counter 
         int counter = mapCount.get(str).intValue() + 1; 
         // overwrite existing with update counter 
         mapCount.put(httpCode, counter + 1); 
        } 
    } 
    
    // ... 
    
0

Поскольку вы действительно запрашиваете другой способ, вы можете пойти с массивом int с индексом массива int, представляющим полученный HTTP-код.

Что-то вроде:

// initialization 
int[] responses = new int[600]; 

// for each received response 
responses[response.getStatusCode().value()]++ 

// retrieving the number of HTTP 200 received 
System.out.println("Number of HTTP 200 received : " + responses[HttpStatus.OK.value()] /* or simply responses[200] */); 

Не уверен, что это приведет к столу, хотя: даже если это немного быстрее, там, конечно, много Интс в этом массиве, который в конечном итоге впустую. В других ответах подробно описывается подход Map, который лучше imho, потому что более явным является то, что вы пытаетесь сделать (это подсчет числа случаев возникновения определенного кода состояния HTTP). И ясность является ключевым при написании кода :)