Как опубликовать параметры массива с помощью HttpComponents

Я хочу выполнить эту команду с http-компонентами Apache (4.1.2)

 curl  --data "strings[]=testOne&string-keys[]=test.one&strings[]=testTwo&string-keys[]=test.two&project=Test" https://api.foo.com/1/string/input-bulk

Целевому API нужны параметры strings и string-keys в виде array, что означает повторение строк [] и строковые ключи [] для каждого параметра.

Эта команда curl работает нормально, но с Http-компонентом, при этом у меня точно такие же параметры.

Может я что-то не так делаю.

    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add( new BasicNameValuePair( "project", PROJECT_NAME ) );

    for ( Entry entry : newEntries )
    {
        params.add( new BasicNameValuePair( "string-keys[]", entry.getKey() ) );
        params.add( new BasicNameValuePair( "strings[]", entry.getValue() ) );
        params.add( new BasicNameValuePair( "context[]", "" ) );
    }

    URI uri = URIUtils.createURI( "https", "api.foo.com", -1, "/1/string/input-bulk", null, null );

    UrlEncodedFormEntity paramEntity = new UrlEncodedFormEntity( params );
    logger.info( "POST params : {}", EntityUtils.toString( paramEntity ) );
    HttpPost httpRequest = new HttpPost( uri );
    httpRequest.setEntity( paramEntity );

    HttpResponse response = new DefaultHttpClient().execute( httpRequest );

Параметры POST выглядят так:

POST params : project=Test&string-keys%5B%5D=test.one&strings%5B%5D=TestOne&string-keys%5B%5D=test.two&strings%5B%5D=TestTwo

Если я поставлю их за --data в curl, это будет работать, но не с HttpCoponents. Может кто-нибудь объяснить мне, почему?

заранее спасибо


person tbruyelle    schedule 05.09.2011    source источник


Ответы (1)


Попробуйте добавить заголовок «application / x-www-form-urlencoded» в свой httpRequest.


    httpRequest.addHeader("content-type", "application/x-www-form-urlencoded");
    HttpResponse response = new DefaultHttpClient().execute( httpRequest );

Надеюсь, это сработает

person momo    schedule 05.09.2011
comment
Вы пробовали использовать StringEntity вместо UrlEncodedFormEntity? - person momo; 05.09.2011
comment
Хорошо, поэтому использование StringEntity ничего не меняет, похоже, моя проблема не имеет ничего общего с кодировкой. Обновляю свой вопрос. - person tbruyelle; 06.09.2011
comment
Попробуем еще кое-что. Я читал в нескольких местах, что форма ввода с тем же именем должна быть сгруппирована и разделена запятой. Возможно, curl выполняет группировку за вас, а Android - нет. Таким образом, для strings [] со значением1 и значением2 у вас должны быть строки [] = значение1, значение2 в паре ключ-значение. - person momo; 06.09.2011
comment
спасибо, но я решил перейти на httpclient 3.x, и все работает как шарм (+1 за вашу помощь;)) - person tbruyelle; 06.09.2011
comment
@tbruyelle Что сработало? Вы используете String Entity? У меня похожая проблема ... Я хочу отправить Список ‹Long› ... не знаю, как это сделать. Я звоню в веб-службу. В cxf есть WebClient, который напрямую принимает список, но я застрял с httpclient 4.x - person Jigar Shah; 09.08.2012
comment
@tbruyelle Как это работало? У вас есть рабочий образец, которым можно поделиться? - person simpleusr; 25.03.2019