Как вернуть XML из веб-сервиса - PullRequest
4 голосов
/ 03 августа 2011

Это может быть один из безумных / глупых / глупых / длинных вопросов, поскольку я новичок в веб-сервисах.
Я хочу написать веб-сервис, который будет возвращать ответ в формате XML (я использую свой сервис для YUIавтозаполнение).Я использую Eclipse и Axis2 и следую http://www.softwareagility.gr/index.php?q=node/21 Я хочу получить ответ в следующем формате

<codes>
<code value="Pegfilgrastim"/>
<code value="Peggs"/>
<code value="Peggy"/>
<code value="Peginterferon alfa-2 b"/>
<code value="Pegram"/>
</codes>

Количество элементов code может варьироваться в зависимости от ответа.До сих пор я пробовал следующие способы
1) Создать XML с использованием буфера String и вернуть строку. (я предоставляю частичный код, чтобы избежать путаницы)

public String myService ()
{    
    // Some other stuff
    StringBuffer outputXML = new StringBuffer();
    outputXML.append("<?xml version='1.0' standalone='yes'?>");
    outputXML.append("<codes>");
    while(SOME_CONDITION)
    {
       // Some business logic
       outputXML.append("<code value=\""+tempStr+"\">"+"</code>");    
    }
    outputXML.append("</codes>");
    return (outputXML.toString());  
}

Это дает следующий ответс нежелательными элементами <ns:myServiceResponse> и <ns:return>.

<ns:myServiceResponse>
<ns:return>
<?xml version='1.0' standalone='yes'?><codes><code value="Peg-shaped teeth"></code><code value="Pegaspargase"></code><code value="Pegfilgrastim"></code><code value="Peggs"></code><code value="Peggy"></code><code value="Peginterferon alfa-2 b"></code><code value="Pegram"></code></codes>
</ns:return>
</ns:findTermsResponse>    

Но он не работал с автозаполнением YUI (возможно, потому, что требовался ответ в указанном выше формате)
2) Использование DocumentBuilderFactory :
Как

public Element myService ()
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = factory.newDocumentBuilder();
    Document doc = docBuilder.newDocument();
    Element codes = doc.createElement("codes");
    while(SOME_CONDITION)
    {
      // Some business logic
      Element code = doc.createElement("code");
      code.setAttribute("value", tempStr);
      codes.appendChild(code);
    }
    return(codes);
}  

Получена следующая ошибка

org.apache.axis2.AxisFault: Mapping qname not fond for the package: com.sun.org.apache.xerces.internal.dom  

3) Использование сервлета: Я попытался получить тот же ответ, используя простой сервлет, и онработал.Вот мой сервлет

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    StringBuffer outputXML = new StringBuffer();
    response.setContentType("text/xml");
    PrintWriter out = response.getWriter();
    outputXML.append("<?xml version='1.0' standalone='yes'?>");
    outputXML.append("<codes>"); 
    while(SOME_CONDITION)
    {
        // Some business logic
        outputXML.append("<code value=\"" + tempStr + "\">" + "</code>");    
    }
    outputXML.append("</codes>");
    out.println(outputXML.toString());
}

Он дал ответ, аналогичный указанному выше, и работал с автозаполнением YUI без каких-либо дополнительных тегов.

Подскажите, пожалуйста, как я могу получить XML-ответ без каких-либо нежелательных элементов?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Axis2 предназначен для доставки объектов обратно вызывающей стороне. Вот почему он добавляет дополнительные вещи к ответу, даже если это простой объект String.

Используя второй подход, ваш сервис возвращает сложный объект Java (Element экземпляр), предназначенный для описания фрагмента XML. Таким образом, вызывающий объект должен знать об этом объекте, чтобы иметь возможность десериализовать его и восстановить объект Java, содержащий данные XML.

Третий подход является самым простым и лучшим в вашем случае в отношении типа возвращаемого значения: он не возвращает сериализованный объект Java, только простой текст XML. Конечно, вы можете использовать DocumentBuilder для подготовки XML, но, в конце концов, вы должны сделать его String, вызвав соответствующий метод getXml(), asXml() (или вид ...)

1 голос
/ 03 августа 2011

Наконец-то все заработало, хотя я не могу удалить ненужный элемент.(Я не беспокоюсь, пока все вещи на месте).Я использовал AXIOM для генерации ответа.

public OMElement myService ()
{
    OMFactory fac = OMAbstractFactory.getOMFactory();
    OMNamespace omNs = fac.createOMNamespace("", "");
    OMElement codes = fac.createOMElement("codes", omNs);
    while(SOME_CONDITION)
    {
       OMElement code = fac.createOMElement("code", null, codes);
       OMAttribute value = fac.createOMAttribute("value", null, tempStr);
       code.addAttribute(value);
    }
    return(codes); 
}

Ссылки: 1) http://songcuulong.com/public/html/webservice/create_ws.html
2) http://sv.tomicom.ac.jp/~koba/axis2-1.3/docs/xdocs/1_3/rest-ws.html

0 голосов
/ 03 августа 2011

Я думаю, что вы не можете вернуть свой пользовательский XML с помощью Axis. В любом случае, он обернет его в свой конверт.

...