2015-04-21 2 views
0

Я пишу SOAP-клиент, используя org.apache.http.impl.client.CloseableHttpClient, чтобы сделать SOAP-вызов внешней системе через прокси-сервер.HttpClient HttpPost приводит к ответу HTTP 400

Из файла журнала похоже, что соединение через прокси-сервер выполнено успешно, но запрос POST на внешнюю конечную точку системы приводит к ошибке HTTP 400 Bad Request.

Я не могу понять, что вызывает эту ошибку. Может кто-нибудь взглянуть и посмотреть, чего не хватает? Заранее благодарны за Вашу помощь.

[4/20/15 20:37:04:850 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "POST /Staging/DataTransfer.asmx HTTP/1.1[\r][\n]" 
[4/20/15 20:37:04:850 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "SOAPAction: http://data.types.services.ecomm.stores.com/TransferCart[\r][\n]" 
[4/20/15 20:37:04:850 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "Content-Type: text/xml[\r][\n]" 
[4/20/15 20:37:04:865 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "Accept-Encoding: text/xml[\r][\n]" 
[4/20/15 20:37:04:865 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "Content-Length: 2022[\r][\n]" 
[4/20/15 20:37:04:865 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "Host: abc.test.com:443[\r][\n]" 
[4/20/15 20:37:04:865 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "Connection: Keep-Alive[\r][\n]" 
[4/20/15 20:37:04:865 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "User-Agent: Apache-HttpClient/4.4.1 (Java/1.6.0)[\r][\n]" 
[4/20/15 20:37:04:865 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "[\r][\n]" 
[4/20/15 20:37:04:865 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 >> "TESTDATA" 
[4/20/15 20:37:05:099 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 << "HTTP/1.1 400 Bad Request[\r][\n]" 
[4/20/15 20:37:05:099 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 << "via: IG Proxy[\r][\n]" 
[4/20/15 20:37:05:099 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 << "Date: Tue, 21 Apr 2015 00:37:01 GMT[\r][\n]" 
[4/20/15 20:37:05:099 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 << "Server: Microsoft-HTTPAPI/2.0[\r][\n]" 
[4/20/15 20:37:05:099 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 << "Connection: Keep-Alive[\r][\n]" 
[4/20/15 20:37:05:099 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 << "Content-Type: text/html; charset=us-ascii[\r][\n]" 
[4/20/15 20:37:05:099 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 << "Content-Length: 311[\r][\n]" 
[4/20/15 20:37:05:099 EDT] 0000001c wire   1 org.apache.http.impl.conn.Wire wire http-outgoing-2 << "[\r][\n]" 

Конечно - вот код:

  CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
     credsProvider.setCredentials(
       new AuthScope(PROXY_HOST, PROXY_PORT), 
       new UsernamePasswordCredentials(PROXY_USER, PROXY_PASSWORD)); 
     CloseableHttpClient httpclient = HttpClients.custom() 
       .setDefaultCredentialsProvider(credsProvider).build(); 

     HttpHost target = new HttpHost(ENDPOINT_HOST, 443, "https"); 
     HttpHost proxy = new HttpHost(PROXY_HOST, PROXY_PORT); 

     RequestConfig config = RequestConfig.custom() 
     .setProxy(proxy) 
     .build(); 

     HttpPost httppost = new HttpPost(ENDPOINT_API_URL); 
     httppost.setConfig(config); 
     httppost.setHeader("SOAPAction", SOAPAction); 
     httppost.setHeader("Content-Type", "application/soap+xml;charset=UTF-8;"); 
     httppost.setHeader("Accept-Encoding", "text/xml"); 
     httppost.setEntity(new StringEntity(postBody, "UTF-8")); 

     //if(LOG.isLoggable(Level.FINE)) 
     LOG.info("Executing request " + httppost.getRequestLine() + " to " + target + " via " + proxy); 

     CloseableHttpResponse response = httpclient.execute(target, httppost); 

     LOG.info("CartTransfer HTTP Status=" + response.getStatusLine()); 
+0

Просьба предоставить нам средства, которые помогут вам. TL; DR разместите свой код. –

ответ

0

Проблема может быть просто о чем выше/вне вашего TCP/IP-уровня "подключения". Посмотрите здесь несколько примеров:

STRONG SUGGESTIONS:

  • Получить SoapUI, если вы уже не имеете его. Создайте фиктивный ответ SOAP, укажите своего клиента в SoapUI и убедитесь, что запрос в порядке (похоже, что он есть). Затем создайте фиктивный запрос SOAP и укажите SoapUI на вашем сервере. Посмотрите, можете ли вы точно определить, «что происходит».

  • Получить Fiddler2, если у вас его еще нет. Наблюдайте за движением вперед и назад (запросы и ответы).

  • Включите полную регистрацию на сервере, чтобы лучше понять, «что пойдет не так».

Q: Какой язык и библиотека SOAP вы используете на клиенте? На сервере?

В: Можно ли опубликовать примерные фрагменты отказоустойчивого кода на стороне клиента и код на стороне сервера?

0

Благодарим вас за внимание и не торопитесь ответить.

Проблема была проще, чем я ожидал. Служба ожидает две строки. Одна из строк, которые я отправляю, находится в формате XML, и это путало службу. Как только я закодировал строку, сервер смог получить и проанализировать запрос.

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