2010-06-14 6 views
1

Когда я связываюсь с веб-службой с помощью Java HttpUrlConnection, он просто возвращает 400 Bad Request (IOException). Как получить информацию XML, возвращаемую сервером; он, похоже, не находится в getErrorStream соединения, ни в какой-либо из информации об исключении.Ошибка Java getInputStream 400

Когда я запускаю следующий PHP код с веб-сервиса:

<?php 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "https://www.myclientaddress.com/here/"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST,1); 
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=ted&password=scheckler&type=consumer&id=123456789&zip=12345"); 

$result=curl_exec ($ch); 
echo $result; 
?> 

возвращает следующее:

<?xml version="1.0" encoding="utf-8"?> 
<response> 
    <status>failure</status> 
    <errors> 
     <error name="RES_ZIP">Zip code is not valid.</error> 
     <error name="ZIP">Invalid zip code for residence address.</error> 
    </errors> 
</response> 

, так что я знаю, что информация существует

ответ

0

Если сервер возвращается XML и вы передаете параметры в качестве URL-адреса, почему бы просто не использовать библиотеку, поддерживающую JAX-RS (API-интерфейс Java REST для веб-сервисов), например Apache CXF?

Я знаю, что он поддерживает JAX-RS, поскольку он содержит chapter в руководстве.

+0

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

0

У меня была такая же проблема и добавление ниже двух линий разрешило это.

httpConn.setRequestProperty («Соединение», «Закрыть»); System.setProperty ("http.keepAlive", "false");

1

HttpURLConnection возвращает FileNotFoundException, если вы пытаетесь прочитать getInputStream() из соединения, поэтому вы должны использовать вместо getErrorStream() всякий раз, когда код состояния равен или выше, чем 400.

Более того, пожалуйста, будьте осторожны поскольку код статуса успеха не только 200, даже 201, 204 и т. д. часто используются как статусы успеха.

Вот пример того, как я пошел, чтобы управлять его

// ... connection code code code ... 

// Get the response code 
int statusCode = connection.getResponseCode(); 

InputStream is = null; 

if (statusCode >= 200 && statusCode < 400) { 
    // Create an InputStream in order to extract the response object 
    is = connection.getInputStream(); 
} 
else { 
    is = connection.getErrorStream(); 
} 

// ... callback/response to your handler.... 

Таким образом, вы будете иметь возможность получить необходимую реакцию как успех и ошибок случаях.

Надеюсь, это поможет!

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