2012-03-28 3 views
41

Я использую общедоступность HttpClient, чтобы сделать http-вызов сервлета Spring. Мне нужно добавить несколько параметров в строку запроса. Поэтому я делаю следующее:commons httpclient - Добавление параметров строки запроса в запрос GET/POST

HttpRequestBase request = new HttpGet(url); 
HttpParams params = new BasicHttpParams(); 
params.setParameter("key1", "value1"); 
params.setParameter("key2", "value2"); 
params.setParameter("key3", "value3"); 
request.setParams(params); 
HttpClient httpClient = new DefaultHttpClient(); 
httpClient.execute(request); 

Однако, когда я пытаюсь прочитать параметр в сервлет с помощью

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getParameter("key"); 

она возвращает нуль. Фактически параметрMap полностью пуст. Когда я вручную добавляю параметры к URL-адресу перед созданием запроса HttpGet, параметры доступны в сервлете. То же самое, когда я ударил сервлет из браузера, используя URL с добавлением queryString.

Какая здесь ошибка? В httpclient 3.x у GetMethod был метод setQueryString(), чтобы добавить запрос. Что эквивалентно в 4.x?

ответ

61

Вот как добавить параметры строки запроса с помощью HttpClient 4.2 и более поздних версий:

URIBuilder builder = new URIBuilder("http://example.com/"); 
builder.setParameter("parts", "all").setParameter("action", "finish"); 

HttpPost post = new HttpPost(builder.build()); 

Полученный URI будет выглядеть следующим образом:

http://example.com/?parts=all&action=finish 
11

Интерфейс HttpParams не существует для указания параметров строки запроса, он предназначен для указания поведения во время выполнения объекта HttpClient.

Если вы хотите передать параметры строки запроса, вам необходимо собрать их по URL-адресу самостоятельно, например.

new HttpGet(url + "key1=" + value1 + ...); 

Помните кодировать значения первых (с использованием URLEncoder).

+3

Нет ли способ добавить параметр строки запроса после того как объект запроса уже создан? Если нет, существует ли другой стандартный способ передать параметры сервлету для любого метода запроса (GET/PUT/POST)? – Oceanic

23

Если вы хотите добавить параметр запроса после создания запроса, попробуйте отличить HttpRequest до HttpBaseRequest. После этого вы можете изменить URI из отлитого запроса:

HttpGet someHttpGet = new HttpGet("http://google.de"); 

URI uri = new URIBuilder(someHttpGet.getURI()).addParameter("q", 
     "That was easy!").build(); 

((HttpRequestBase) someHttpGet).setURI(uri); 
1

Этот подход одобрен, но не работает, когда вы получаете параметры динамически, иногда 1, 2, 3 или более, точно так же, как поисковый запрос SOLR (например)

Вот более гибкое решение. Сырой, но может быть уточнен.

public static void main(String[] args) { 

    String host = "localhost"; 
    String port = "9093"; 

    String param = "/10-2014.01?description=cars&verbose=true&hl=true&hl.simple.pre=<b>&hl.simple.post=</b>"; 
    String[] wholeString = param.split("\\?"); 
    String theQueryString = wholeString.length > 1 ? wholeString[1] : ""; 

    String SolrUrl = "http://" + host + ":" + port + "/mypublish-services/carclassifications/" + "loc"; 

    GetMethod method = new GetMethod(SolrUrl); 

    if (theQueryString.equalsIgnoreCase("")) { 
     method.setQueryString(new NameValuePair[]{ 
     }); 
    } else { 
     String[] paramKeyValuesArray = theQueryString.split("&"); 
     List<String> list = Arrays.asList(paramKeyValuesArray); 
     List<NameValuePair> nvPairList = new ArrayList<NameValuePair>(); 
     for (String s : list) { 
      String[] nvPair = s.split("="); 
      String theKey = nvPair[0]; 
      String theValue = nvPair[1]; 
      NameValuePair nameValuePair = new NameValuePair(theKey, theValue); 
      nvPairList.add(nameValuePair); 
     } 
     NameValuePair[] nvPairArray = new NameValuePair[nvPairList.size()]; 
     nvPairList.toArray(nvPairArray); 
     method.setQueryString(nvPairArray);  // Encoding is taken care of here by setQueryString 

    } 
} 
+0

GetMethod? это от httpclient? потому что вопрос об этом. – Walfrat

+0

Да, из org.apache.commons.httpclient.methods. –

+0

ах да, но похоже, что это для версии 3.x, в 4.x, теперь это org.apache.http.client.methods.HttpGet – Walfrat

2
I am using httpclient 4.4. For solr query I used the following way and it worked. 

NameValuePair nv2 = new BasicNameValuePair("fq","(active:true) AND (category:Fruit OR category1:Vegetable)"); 
nvPairList.add(nv2); 
NameValuePair nv3 = new BasicNameValuePair("wt","json"); 
nvPairList.add(nv3); 
NameValuePair nv4 = new BasicNameValuePair("start","0"); 
nvPairList.add(nv4); 
NameValuePair nv5 = new BasicNameValuePair("rows","10"); 
nvPairList.add(nv5); 

HttpClient client = HttpClientBuilder.create().build(); 
HttpGet request = new HttpGet(url); 
URI uri = new URIBuilder(request.getURI()).addParameters(nvPairList).build(); 
      request.setURI(uri); 

HttpResponse response = client.execute(request);  
if (response.getStatusLine().getStatusCode() != 200) { 

} 

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

String output; 
System.out.println("Output .... "); 
String respStr = ""; 
while ((output = br.readLine()) != null) { 
    respStr = respStr + output; 
    System.out.println(output); 
} 
+0

Этот ответ выиграет от большего объяснения –

+0

Этот ответ был очень полезен для моего случая потому что я не мог найти способ инициализировать URIBuilder с полным URI, например 'http: // myserver/apipath'. При инициализации с ним URIBuilder использовал только 'http: // myserver' и игнорировал'/apipath'. URI был предоставлен извне, поэтому я не хотел его вручную анализировать, чтобы использовать URIBuilder. – nuoritoveri

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