Отправка xml с использованием Apache HttpComponents

Я пытаюсь воспроизвести следующий код С# в Java. Этот код является вспомогательным классом, который отправляет запрос, содержащий XML, и считывает ответ.

    internal static String Send(String url, String body)
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        try
        {
            // create the new httpwebrequest with the uri
            request.ContentLength = 0;
            // set the method to POST
            request.Method = "POST";

            if (!String.IsNullOrEmpty(body))
            {
                request.ContentType = "application/xml; charset=utf-8";
                byte[] postData = Encoding.Default.GetBytes(body);
                request.ContentLength = postData.Length;
                using (Stream s = request.GetRequestStream())
                {
                    s.Write(postData, 0, postData.Length);
                }

            }

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                String responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new ResponseException(((int)response.StatusCode),
                        response.StatusCode.ToString(), request.RequestUri.ToString(),
                        responseString);
                }
                return responseString;
            }
        }
        catch (WebException e)
        {
            using (WebResponse response = e.Response)
            {
                HttpWebResponse httpResponse = response as HttpWebResponse;
                if (httpResponse != null)
                {
                    using (Stream data = response.GetResponseStream())
                    {
                        data.Position = 0;
                        throw new ResponseException(((int)httpResponse.StatusCode),
                                httpResponse.StatusCode.ToString(), request.RequestUri.ToString(),
                                new StreamReader(data).ReadToEnd()
                            );
                    }
                }
                else
                {
                    throw;
                }

Прочитав другие темы, я решил, что библиотека Apache HttpComponents будет лучшим выбором для получения той же функциональности. Прочитав документацию и следуя примеру здесь:

http://hc.apache.org/httpcomponents-client-ga/quickstart.html

Я не могу понять, как отправить строку тела в виде xml. Когда я пытаюсь установить сущность для запроса, мне требуется объявить BasicNameValuePair, и я не понимаю, что это такое и как мне отформатировать строку тела, чтобы она соответствовала этой спецификации. Ниже то, что я сделал в настоящее время.

    protected static String Send(String url, String body)
{
    HttpPost request = new HttpPost(url);

    try
    {
        request.setHeader("ContentType", "application/xml; charset=utf=8");

        // Encode the body if needed
        request.setEntity(new UrlEncodedFormEntity());

        //get the response

        // if the response code is not valid throw a ResponseException

        // else return the response string. 

    } finally {
        request.releaseConnection();
    }
    return null;
}

EDIT: или я должен использовать StringEntity и сделать следующее

    protected static String SendToJetstream(String url, String body)
{
    HttpPost request = new HttpPost(url);

    try
    {
        StringEntity myEntity = new StringEntity(body, 
                ContentType.create("application/xml", "UTF-8"));


        // Encode the body if needed
        request.setEntity(myEntity);

        //get the response

        // if the response code is not valid throw a ResponseException

        // else return the response string. 

    } finally {
        request.releaseConnection();
    }
    return null;
}

person JME    schedule 30.05.2013    source источник


Ответы (1)


Используйте FileEntity

File file = new File("somefile.xml");
FileEntity entity = new FileEntity(file, ContentType.create("application/xml", "UTF-8"));

Здесь много хороших примеров: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e165

person Keith    schedule 30.05.2013
comment
Поскольку мой xml в настоящее время передается как строка, лучше ли мое редактирование с использованием StringEntity? - person JME; 30.05.2013