java.io.IOException:HTTP请求失败,HTTP状态:500(ksoap2)

时间:2016-07-28 14:11:32

标签: java android android-ksoap2 ksoap

我使用KSOAP2,在向服务器发送请求并获得java.io.IOException时:HTTP请求失败,HTTP状态:行httpTransport.call(SOAP_ACTION, envelope)中的500,但服务器正常工作,我已经检查过了使用SoapUI。可能是什么问题?

public class SOAPClient
{
    private static final int TIMEOUT_SOCKET = 180000;

    public static SoapObject get(Context context, String methodName, ArrayList<Pair<String, ?>> args) throws Exception
    {
        final String URL = PrefHelper.getSOAPUrl(context);
        final String NAMESPACE = PrefHelper.getSOAPNamespace(context);
        final String SOAP_ACTION = methodName; //NAMESPACE + "#" + "mapx" + ":" + methodName;

        SoapObjectEve request = new SoapObjectEve(NAMESPACE, methodName);

        if (args != null) {
            for (Pair<String, ?> arg : args) {
                if (arg.first != null) {
                    request.addProperty(arg.first, arg.second);
                }
            }
        }

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        new MarshalBase64().register(envelope);
        envelope.setOutputSoapObject(request);

        envelope.implicitTypes = true;

        HttpTransportSE httpTransport = new HttpTransportSE(URL, TIMEOUT_SOCKET);
        httpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        try 
        {
            httpTransport.call(SOAP_ACTION, envelope);
            AppLog.e(httpTransport.requestDump+"requestDump");


        }
        catch (ConnectTimeoutException e) {
            AppLog.e(e.getMessage());
            throw new Exception(context.getString(R.string.node_unavailable));
        }
        catch (SocketTimeoutException e) {
            AppLog.e(e.getMessage());
            throw new Exception(context.getString(R.string.timeout));
        }
        catch (Exception e) {
            e.printStackTrace();
            AppLog.e(e.getMessage());

            AppLog.e(httpTransport.requestDump+"requestDump");
            throw new Exception(context.getString(R.string.warning_error_get_data) + e.getMessage() == null ? "" : " " + e.getMessage());
        }

        AppLog.i(httpTransport.requestDump+"requestDump");

        SoapObject soapObj = null;

        try {
            soapObj = (SoapObject) envelope.getResponse();
        }
        catch (Exception e) {

            String response = ((SoapPrimitive) envelope.getResponse()).toString();
            boolean res = Boolean.valueOf(response);

            soapObj = new SoapObject();
            soapObj.addProperty("response", res);
            soapObj.addProperty("msg", "");
            soapObj.addProperty("data", null);

        }
        AppLog.e(httpTransport.responseDump+"responseDump");
        return soapObj;
    }
}

1 个答案:

答案 0 :(得分:3)

确保您的NAMESPACEMETHODNAMEWSDLSOAP_ACTION正确无误。

试试这段代码,

private static final String NAMESPACE = "http://www.kltro.com";
private static final String METHODNAME = "getUser";
private static final String WSDL = "http://ap.kashkan.org:55555/tro/ws/kltro";
private static final String SOAP_ACTION = NAMESPACE + "#kltro:" + METHODNAME ;

private static String TAG = "soap";

public static String callWebservice() {
    String responseDump = "";
    try {
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        SoapObject request = new SoapObject(NAMESPACE, METHODNAME);
        request.addProperty("login", login);
        request.addProperty("pass", password);
        request.addProperty("androidID", androidID);
        request.addProperty("ver", version);

        envelope.bodyOut = request;
        HttpTransportSE transport = new HttpTransportSE(WSDL);
        transport.debug = true;
        try {
            transport.call(SOAP_ACTION, envelope);
            String requestDump = transport.requestDump;
            responseDump = transport.responseDump;
            Log.e(TAG, requestDump);
            Log.e(TAG, responseDump);
        } catch (IOException e) {
            e.printStackTrace();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return responseDump;
}

还要确保您在清单中拥有互联网权限

<uses-permission android:name="android.permission.INTERNET" />