blob: c63632f2d6b25661cac5fd6ed5774d386dd917d8 [file] [log] [blame]
<!DOCTYPE html>
<!--
| Generated by Apache Maven Doxia at 2015-12-28
| Rendered using Apache Maven Fluido Skin 1.4
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="Date-Revision-yyyymmdd" content="20151228" />
<meta http-equiv="Content-Language" content="en" />
<title>Apache Axis2 &#x2013; </title>
<link rel="stylesheet" href="../css/apache-maven-fluido-1.4.min.css" />
<link rel="stylesheet" href="../css/site.css" />
<link rel="stylesheet" href="../css/print.css" media="print" />
<script type="text/javascript" src="../js/apache-maven-fluido-1.4.min.js"></script>
<meta name="generator" content="HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" /><meta http-equiv="content-type" content="text/html; charset=us-ascii" /><meta name="AUTHOR" content="Isuru Suriarachchi" /><meta name="CREATED" content="20070203;331600" /><meta name="CHANGEDBY" content="Isuru Suriarachchi" /><meta name="CHANGED" content="20070208;12031400" /><style type="text/css"></style> </head>
<body class="topBarDisabled">
<div class="container-fluid">
<div id="banner">
<div class="pull-left">
<a href="http://www.apache.org/" id="bannerLeft">
<img src="http://www.apache.org/images/asf_logo_wide.png" alt="Apache Axis2"/>
</a>
</div>
<div class="pull-right"> <a href=".././" id="bannerRight">
<img src="../images/axis.jpg" />
</a>
</div>
<div class="clear"><hr/></div>
</div>
<div id="breadcrumbs">
<ul class="breadcrumb">
<li id="publishDate">Last Published: 2015-12-28
<span class="divider">|</span>
</li>
<li id="projectVersion">Version: 1.6.4
<span class="divider">|</span>
</li>
<li class="">
<a href="http://www.apache.org" class="externalLink" title="Apache">
Apache</a>
<span class="divider">/</span>
</li>
<li class="">
<a href="../index.html" title="Axis2/Java">
Axis2/Java</a>
<span class="divider">/</span>
</li>
<li class="active "></li>
</ul>
</div>
<div class="row-fluid">
<div id="leftColumn" class="span2">
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">Axis2/Java</li>
<li>
<a href="../index.html" title="Home">
<span class="none"></span>
Home</a>
</li>
<li>
<a href="../download.html" title="Downloads">
<span class="none"></span>
Downloads</a>
</li>
<li>
<a href="javascript:void(0)" title="Release Notes">
<span class="icon-chevron-down"></span>
Release Notes</a>
<ul class="nav nav-list">
<li>
<a href="../release-notes/1.6.1.html" title="1.6.1">
<span class="none"></span>
1.6.1</a>
</li>
<li>
<a href="../release-notes/1.6.2.html" title="1.6.2">
<span class="none"></span>
1.6.2</a>
</li>
<li>
<a href="../release-notes/1.6.3.html" title="1.6.3">
<span class="none"></span>
1.6.3</a>
</li>
<li>
<a href="../release-notes/1.6.4.html" title="1.6.4">
<span class="none"></span>
1.6.4</a>
</li>
</ul>
</li>
<li>
<a href="../modules/index.html" title="Modules">
<span class="none"></span>
Modules</a>
</li>
<li>
<a href="../tools/index.html" title="Tools">
<span class="none"></span>
Tools</a>
</li>
<li class="nav-header">Documentation</li>
<li>
<a href="../docs/toc.html" title="Table of Contents">
<span class="none"></span>
Table of Contents</a>
</li>
<li>
<a href="../docs/installationguide.html" title="Installation Guide">
<span class="none"></span>
Installation Guide</a>
</li>
<li>
<a href="../docs/quickstartguide.html" title="QuickStart Guide">
<span class="none"></span>
QuickStart Guide</a>
</li>
<li>
<a href="../docs/userguide.html" title="User Guide">
<span class="none"></span>
User Guide</a>
</li>
<li>
<a href="../docs/jaxws-guide.html" title="JAXWS Guide">
<span class="none"></span>
JAXWS Guide</a>
</li>
<li>
<a href="../docs/pojoguide.html" title="POJO Guide">
<span class="none"></span>
POJO Guide</a>
</li>
<li>
<a href="../docs/spring.html" title="Spring Guide">
<span class="none"></span>
Spring Guide</a>
</li>
<li>
<a href="../docs/webadminguide.html" title="Web Administrator's Guide">
<span class="none"></span>
Web Administrator's Guide</a>
</li>
<li>
<a href="../docs/migration.html" title="Migration Guide (from Axis1)">
<span class="none"></span>
Migration Guide (from Axis1)</a>
</li>
<li class="nav-header">Resources</li>
<li>
<a href="../faq.html" title="FAQ">
<span class="none"></span>
FAQ</a>
</li>
<li>
<a href="../articles.html" title="Articles">
<span class="none"></span>
Articles</a>
</li>
<li>
<a href="http://wiki.apache.org/ws/FrontPage/Axis2/" class="externalLink" title="Wiki">
<span class="none"></span>
Wiki</a>
</li>
<li>
<a href="../refLib.html" title="Reference Library">
<span class="none"></span>
Reference Library</a>
</li>
<li>
<a href="../apidocs/index.html" title="Online Java Docs">
<span class="none"></span>
Online Java Docs</a>
</li>
<li class="nav-header">Get Involved</li>
<li>
<a href="../overview.html" title="Overview">
<span class="none"></span>
Overview</a>
</li>
<li>
<a href="../svn.html" title="Checkout the Source">
<span class="none"></span>
Checkout the Source</a>
</li>
<li>
<a href="../mail-lists.html" title="Mailing Lists">
<span class="none"></span>
Mailing Lists</a>
</li>
<li>
<a href="../release-process.html" title="Release Process">
<span class="none"></span>
Release Process</a>
</li>
<li>
<a href="../guidelines.html" title="Developer Guidelines">
<span class="none"></span>
Developer Guidelines</a>
</li>
<li>
<a href="../siteHowTo.html" title="Build the Site">
<span class="none"></span>
Build the Site</a>
</li>
<li class="nav-header">Project Information</li>
<li>
<a href="../team-list.html" title="Project Team">
<span class="none"></span>
Project Team</a>
</li>
<li>
<a href="../issue-tracking.html" title="Issue Tracking">
<span class="none"></span>
Issue Tracking</a>
</li>
<li>
<a href="http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/" class="externalLink" title="Source Code">
<span class="none"></span>
Source Code</a>
</li>
<li>
<a href="../thanks.html" title="Acknowledgements">
<span class="none"></span>
Acknowledgements</a>
</li>
<li class="nav-header">Apache</li>
<li>
<a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="externalLink" title="License">
<span class="none"></span>
License</a>
</li>
<li>
<a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship">
<span class="none"></span>
Sponsorship</a>
</li>
<li>
<a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks">
<span class="none"></span>
Thanks</a>
</li>
<li>
<a href="http://www.apache.org/security/" class="externalLink" title="Security">
<span class="none"></span>
Security</a>
</li>
</ul>
<hr />
<div id="poweredBy">
<div class="clear"></div>
<div class="clear"></div>
<div class="clear"></div>
<div class="clear"></div>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
<img class="builtBy" alt="Built by Maven" src="../images/logos/maven-feather.png" />
</a>
</div>
</div>
</div>
<div id="bodyColumn" class="span10" >
<!-- ~ Licensed to the Apache Software Foundation (ASF) under one
~ or more contributor license agreements. See the NOTICE file
~ distributed with this work for additional information
~ regarding copyright ownership. The ASF licenses this file
~ to you under the Apache License, Version 2.0 (the
~ "License"); you may not use this file except in compliance
~ with the License. You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing,
~ software distributed under the License is distributed on an
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~ KIND, either express or implied. See the License for the
~ specific language governing permissions and limitations
~ under the License. --><html xmlns="http://www.w3.org/1999/xhtml">
<h1 class="title">JSON Support in Axis2</h1>
<p>This document explains the JSON support implementation in Axis2.
It includes an introduction to JSON, an outline as to why JSON
support is useful to Axis2 and how it should be used. This document
also provides details on test cases and samples.</p>
<div class="section">
<h3><a name="What_is_JSON"></a>What is JSON?</h3>
<p><a class="externalLink" href="http://www.json.org/">JSON</a> (Java Script Object
Notation) is another data exchangeable format like XML, but more
lightweight and easily readable. It is based on a subset of the
JavaScript language. Therefore, JavaScript can understand JSON, and
it can make JavaScript objects by using JSON strings. JSON is based
on key-value pairs and it uses colons to separate keys and values.
JSON doesn't use end tags, and it uses braces (curly brackets) to
enclose JSON Objects.</p>
<p><font size="3">e.g. <font size="2">&lt;root&gt;&lt;test&gt;json
object&lt;/test&gt;&lt;/root&gt; ==
{{json object}}</font></font></p>
<p>When it comes to converting XML to JSON and vice versa, there
are two major conventions, one named &quot;<a class="externalLink" href="http://www.sklar.com/badgerfish/">Badgerfish</a>&quot; and the other,
Mapped. The main difference
between these two conventions exists in the way they map XML
namespaces into JSON.</p>
<p><font size="3">e.g. <font size="2">&lt;xsl:root
xmlns:xsl=&quot;http://foo.com&quot;&gt;&lt;data&gt;my json
string&lt;/data&gt;&lt;/xsl:root&gt;</font></font></p>
<p>This XML string can be converted into JSON as follows.</p>
<p><b>Using Badgerfish</b></p>
<p><font size="2">{&quot;xsl:root&quot;:{&quot;@xmlns&quot;:{&quot;xsl&quot;:&quot;http://foo.com&quot;},&quot;data&quot;:{&quot;$&quot;:&quot;my
json string&quot;}}}</font></p>
<p><b>Using Mapped</b></p>
<p>If we use the namespace mapping as http://foo.com -&gt; foo</p>
<p><font size="2">{&quot;foo.root&quot;:{&quot;data&quot;:&quot;my json string&quot;}}</font></p>
<p>JSON support is a new feature in <a href="../index.html">Apache Axis2/Java</a>. It will become
a crucial improvement in the future with applications like
JavaScript Web services.</p>
</div>
<div class="section">
<h2><a name="Why_JSON_Support_for_Axis2"></a>Why JSON Support for Axis2?</h2>
<p><a href="../index.html">Apache Axis2</a> is a Web
services stack that delivers incoming messages into target
applications. In most cases, these messages are SOAP messages. In
addition, it is also possible to send REST messages through Axis2.
Both types of messages use XML as their data exchangeable format.
So if we can use XML as a format, why use JSON as another
format?</p>
<p>There are many advantages of implementing JSON support in Axis2.
Mainly, it helps the JavaScript users (services and clients written
in JavaScript) to deal with Axis2. When the service or the client
is in JavaScript, it can use the JSON string and directly build
JavaScript objects to retrieve information, without having to build
the object model (OMElement in Axis2). Also, JavaScript services
can return the response through Axis2, just as a JSON string can be
shipped in a JSONDataSource.</p>
<p>Other than for that, there are some extra advantages of using
JSON in comparison to XML. Although the conversation
XML or JSON? is still a hot topic,
many people accept the fact that JSON can be passed and built more
easily by machines than XML.</p>
<p>For more details of this implementation architecture, refer to
the article <a class="externalLink" href="http://wso2.org/library/768">&quot;JSON Support for
Apache Axis2&quot;</a></p>
<div class="section">
<h2><a name="How_to_use_JSON_in_Axis2"></a>How to use JSON in Axis2</h2>
<p>At the moment JSON doesn't have a standard and unique content
type. application/json (this is
the content type which is approved in the <a class="externalLink" href="http://www.ietf.org/rfc/rfc4627.txt?number=4627">JSON RFC</a> ),
text/javascript and
text/json are some of the commonly
used content types of JSON. Due to this problem, in Axis2, the user
has been given the freedom of selecting the content type.</p>
<div class="section">
<h3><a name="Step_1"></a>Step 1</h3>
<p>Map the appropriate MessageFormatter and OMBuilder with the
content type you are using in the axis2.xml file.</p>
<p>e.g.1: If you are using the
Mapped convention with the content
type application/json</p>
<div>
<pre>
&lt;messageFormatters&gt;
&lt;messageFormatter contentType=&quot;application/json&quot;
class=&quot;org.apache.axis2.json.JSONMessageFormatter&quot;/&gt;
&lt;!-- more message formatters --&gt;
&lt;/messageFormatters&gt;
&lt;messageBuilders&gt;
&lt;messageBuilder contentType=&quot;application/json&quot;
class=&quot;org.apache.axis2.json.JSONOMBuilder&quot;/&gt;
&lt;!-- more message builders --&gt;
&lt;/messageBuilders&gt;
</pre></div>
<p>e.g.2: If you are using the
Badgerfish convention with the
content type text/javascript</p>
<div>
<pre>
&lt;messageFormatters&gt;
&lt;messageFormatter contentType=&quot;text/javascript&quot;
class=&quot;org.apache.axis2.json.JSONBadgerfishMessageFormatter&quot;/&gt;
&lt;!-- more message formatters --&gt;
&lt;/messageFormatters&gt;
&lt;messageBuilders&gt;
&lt;messageBuilder contentType=&quot;text/javascript&quot;
class=&quot;org.apache.axis2.json.JSONBadgerfishOMBuilder&quot;/&gt;
&lt;!-- more message builders --&gt;
&lt;/messageBuilders&gt;
</pre></div>
</div>
<div class="section">
<h3><a name="Step_2"></a>Step 2</h3>
<p>On the client side, make the ConfigurationContext by reading the
axis2.xml in which the correct mappings are given.</p>
<p>e.g.</p>
<div>
<pre>
File configFile = new File(&quot;test-resources/axis2.xml&quot;);
configurationContext = ConfigurationContextFactory
.createConfigurationContextFromFileSystem(null, configFile.getAbsolutePath());
..........
ServiceClient sender = new ServiceClient(configurationContext, null);
</pre></div>
</div>
<div class="section">
<h3><a name="Step_3"></a>Step 3</h3>
<p>Set the <i>MESSAGE_TYPE</i> option with exactly the same content
type you used in the axis2.xml.</p>
<p>e.g. If you use the content type
application/json,</p>
<div>
<pre>
Options options = new Options();
options.setProperty(Constants.Configuration.MESSAGE_TYPE, application/json);
//more options
//...................
ServiceClient sender = new ServiceClient(configurationContext, null);
sender.setOptions(options);
</pre></div>
<p>If you are sending a request to a remote service, you have to
know the exact JSON content type that is used by that service, and
you have to use that content type in your client as well.</p>
<p>HTTP POST is used as the default method to send JSON messages
through Axis2, if the HTTP method is not explicitly set by the
user. But if you want to send JSON in HTTP GET method as a
parameter, you can do that by just setting an option on the client
side.</p>
<p>e.g.
<tt>options.setProperty(Constants.Configuration.HTTP_METHOD,
Constants.Configuration.HTTP_METHOD_GET);</tt></p>
<p>Here, the Axis2 receiving side (JSONOMBuilder) builds the
OMElement by reading the JSON string which is sent as a parameter.
The request can be made even through the browser.</p>
<p>e.g. Sample JSON request through HTTP GET. The JSON message is
encoded and sent.</p>
<p><tt>GET
/axis2/services/EchoXMLService/echoOM?query=%7B%22echoOM%22:%7B%22data%22:%5B%22my%20json%20string%22,%22my%20second%20json%20string%22%5D%7D%7D
HTTP/1.1</tt></p>
</div>
<div class="section">
<h2><a name="Tests_and_Samples"></a>Tests and Samples</h2>
<div class="section">
<h3><a name="Integration_Test"></a>Integration Test</h3>
<p>The JSON integration test is available under
test in the
json module of Axis2. It uses the
SimpleHTTPServer to deploy the service. A simple echo service is
used to return the incoming OMSourcedElementImpl object, which
contains the JSONDataSource. There are two test cases for two
different conventions and another one test case to send the request
in GET.</p>
</div>
<div class="section">
<h3><a name="Yahoo-JSON_Sample"></a>Yahoo-JSON Sample</h3>
<p>This sample is available in the
samples module of Axis2. It is a
client which calls the Yahoo search API using the GET method, with
the parameter output=json. The
Yahoo search service sends the response as a
formatted JSON string with
the content type text/javascript.
This content type is mapped with the JSONOMBuilder in the
axis2.xml. All the results are shown in a GUI. To run the sample,
execute the ant script.</p>
<p>These two applications provide good examples of using JSON
within Axis2. By reviewing these samples, you will be able to
better understand Axis2's JSON support implementation.</p>
</div>
</html>
</div>
</div>
</div>
<hr/>
<footer>
<div class="container-fluid">
<div class="row-fluid">
<p >Copyright &copy; 2004&#x2013;2015
<a href="http://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.
</p>
</div>
</div>
</footer>
</body>
</html>