You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Miguel Ángel Francisco Fernández (JIRA)" <ji...@apache.org> on 2013/03/28 13:27:18 UTC
[jira] [Comment Edited] (AXIS2-5489) Encoding GET parameters with
'+' character in generated REST clients with WSDL2Java
[ https://issues.apache.org/jira/browse/AXIS2-5489?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13616210#comment-13616210 ]
Miguel Ángel Francisco Fernández edited comment on AXIS2-5489 at 3/28/13 12:26 PM:
-----------------------------------------------------------------------------------
Yes, the problem is that I can't send the + symbol in a GET parameter. For example, if I want to send the string "a+b", I can't, because the + symbol is not encoded, and it is interpreted as a blank space in the server.
This is an example that you can use to reproduce the problem:
------------------------------------------------------------------------------------------
WSDL
------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl"
targetNamespace="http://www.sample.com/wsdl"
xmlns:tns="http://www.sample.com/wsdl"
xmlns:whttp="http://www.w3.org/ns/wsdl/http"
xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msg="http://www.sample.com/xsd">
<wsdl:documentation>
Example
</wsdl:documentation>
<!--
Types
-->
<wsdl:types>
<xs:import namespace="http://www.sample.com/xsd"
schemaLocation="sample.xsd"/>
</wsdl:types>
<!--
Interface
-->
<wsdl:interface name="SampleInterface">
<wsdl:operation name="foo"
pattern="http://www.w3.org/ns/wsdl/in-out"
style="http://www.w3.org/ns/wsdl/style/iri"
wsdlx:safe="true">
<wsdl:documentation>
Example operation.
</wsdl:documentation>
<wsdl:input element="msg:fooParams"/>
<wsdl:output element="msg:fooResponse"/>
</wsdl:operation>
</wsdl:interface>
<!--
Binding
-->
<wsdl:binding name="SampleHTTPBinding"
type="http://www.w3.org/ns/wsdl/http"
interface="tns:SampleInterface">
<wsdl:documentation>
HTTP binding for the Sample service.
</wsdl:documentation>
<wsdl:operation ref="tns:foo" whttp:method="GET"
whttp:location="foo"/>
</wsdl:binding>
<!--
Service
-->
<wsdl:service name="Sample" interface="tns:SampleInterface">
<wsdl:documentation>
Sample service.
</wsdl:documentation>
<wsdl:endpoint name="SampleHTTPEndpoint"
binding="tns:SampleHTTPBinding"
address="http://www.sample.com/">
</wsdl:endpoint>
</wsdl:service>
</wsdl:description>
------------------------------------------------------------------------------------------
XSD
------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.sample.com/xsd"
xmlns:tns="http://www.sample.com/xsd"
xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions">
<!--
Operations
-->
<xsd:element name="fooParams">
<xsd:annotation>
<xsd:documentation>
Params for operation foo.
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bar" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="fooResponse">
<xsd:annotation>
<xsd:documentation>
Response of operation foo.
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bar" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
------------------------------------------------------------------------------------------
wsdl2java command line
------------------------------------------------------------------------------------------
./wsdl2java.sh -wv 2 -uw -o /tmp/output -uri /tmp/sample.wsdl
------------------------------------------------------------------------------------------
Java client using the generated JAR file: Sample-test-client.jar
------------------------------------------------------------------------------------------
public class Main {
public static void main(String[] args) {
try {
SampleStub sampleStub = new SampleStub();
/*
* Invoking the operation with "a b", AXIS2 do the following HTTP
* request:
*
* GET /foo?bar=a%20b HTTP/1.1
* Content-Type: application/x-www-form-urlencoded; charset=UTF-8
* SOAPAction: ""
* User-Agent: Axis2
* Host: www.sample.com
*
* This request is correct because it encodes the space as "%20".
*/
sampleStub.foo("a b");
/*
* Invoking the operation with "a+b", AXIS2 do the following HTTP
* request:
*
* GET /foo?bar=a+b HTTP/1.1
* Content-Type: application/x-www-form-urlencoded; charset=UTF-8
* SOAPAction: ""
* User-Agent: Axis2
* Host: www.sample.com
*
* This request is incorrect because it does not encode the +
* symbol, it should invoke: GET /foo?bar=a%2Bb HTTP/1.1.
*/
sampleStub.foo("a+b");
/*
* Invoking the operation with "a%2Bb", AXIS2 do the following HTTP
* request:
*
* GET /foo?bar=a%252Bb HTTP/1.1
* Content-Type: application/x-www-form-urlencoded; charset=UTF-8
* SOAPAction: ""
* User-Agent: Axis2
* Host: www.sample.com
*
* This request is correct because it encodes the symbol % as
* space as "%25".
*/
sampleStub.foo("a%2Bb");
} catch(Exception e) {
e.printStackTrace();
}
}
}
was (Author: miguelafr):
Yes, the problem is that I can't send the + symbol in a GET parameter. For example, if I want to send the string "a+b", I can't, because the + symbol is not encoded, and it is interpreted as a blank space in the server.
This is an example that you can use to reproduce the problem:
------------------------------------------------------------------------------------------
WSDL
------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl"
targetNamespace="http://www.sample.com/wsdl"
xmlns:tns="http://www.sample.com/wsdl"
xmlns:whttp="http://www.w3.org/ns/wsdl/http"
xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msg="http://www.sample.com/xsd">
<wsdl:documentation>
Example
</wsdl:documentation>
<!--
Types
-->
<wsdl:types>
<xs:import namespace="http://www.sample.com/xsd"
schemaLocation="sample.xsd"/>
</wsdl:types>
<!--
Interface
-->
<wsdl:interface name="SampleInterface">
<wsdl:operation name="foo"
pattern="http://www.w3.org/ns/wsdl/in-out"
style="http://www.w3.org/ns/wsdl/style/iri"
wsdlx:safe="true">
<wsdl:documentation>
Example operation.
</wsdl:documentation>
<wsdl:input element="msg:fooParams"/>
<wsdl:output element="msg:fooResponse"/>
</wsdl:operation>
</wsdl:interface>
<!--
Binding
-->
<wsdl:binding name="SampleHTTPBinding"
type="http://www.w3.org/ns/wsdl/http"
interface="tns:SampleInterface">
<wsdl:documentation>
HTTP binding for the Sample service.
</wsdl:documentation>
<wsdl:operation ref="tns:foo" whttp:method="GET"
whttp:location="foo"/>
</wsdl:binding>
<!--
Service
-->
<wsdl:service name="Sample" interface="tns:SampleInterface">
<wsdl:documentation>
Sample service.
</wsdl:documentation>
<wsdl:endpoint name="SampleHTTPEndpoint"
binding="tns:SampleHTTPBinding"
address="http://www.sample.com/">
</wsdl:endpoint>
</wsdl:service>
</wsdl:description>
------------------------------------------------------------------------------------------
XSD
------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.sample.com/xsd"
xmlns:tns="http://www.sample.com/xsd"
xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions">
<!--
Operations
-->
<xsd:element name="fooParams">
<xsd:annotation>
<xsd:documentation>
Params for operation foo.
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bar" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="fooResponse">
<xsd:annotation>
<xsd:documentation>
Response of operation foo.
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bar" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
------------------------------------------------------------------------------------------
wsdl2java command line
------------------------------------------------------------------------------------------
./wsdl2java.sh -wv 2 -uw -o /tmp/output -uri /tmp/sample.wsdl
------------------------------------------------------------------------------------------
Java client using the generated JAR file: Sample-test-client.jar
------------------------------------------------------------------------------------------
public class Main {
public static void main(String[] args) {
try {
SampleStub sampleStub = new SampleStub();
/*
* Invoking the operation with "a b", AXIS2 do the following HTTP
* request:
*
* GET /foo?bar=a%20b HTTP/1.1
* Content-Type: application/x-www-form-urlencoded; charset=UTF-8
* SOAPAction: ""
* User-Agent: Axis2
* Host: www.sample.com
*
* This request is correct because it encodes the space as "%20".
*/
sampleStub.foo("a b");
/*
* Invoking the operation with "a b", AXIS2 do the following HTTP
* request:
*
* GET /foo?bar=a+b HTTP/1.1
* Content-Type: application/x-www-form-urlencoded; charset=UTF-8
* SOAPAction: ""
* User-Agent: Axis2
* Host: www.sample.com
*
* This request is incorrect because it does not encode the +
* symbol, it should invoke: GET /foo?bar=a%2Bb HTTP/1.1.
*/
sampleStub.foo("a+b");
/*
* Invoking the operation with "a b", AXIS2 do the following HTTP
* request:
*
* GET /foo?bar=a%252Bb HTTP/1.1
* Content-Type: application/x-www-form-urlencoded; charset=UTF-8
* SOAPAction: ""
* User-Agent: Axis2
* Host: www.sample.com
*
* This request is correct because it encodes the symbol % as
* space as "%25".
*/
sampleStub.foo("a%2Bb");
} catch(Exception e) {
e.printStackTrace();
}
}
}
> Encoding GET parameters with '+' character in generated REST clients with WSDL2Java
> -----------------------------------------------------------------------------------
>
> Key: AXIS2-5489
> URL: https://issues.apache.org/jira/browse/AXIS2-5489
> Project: Axis2
> Issue Type: Bug
> Components: kernel, transports
> Affects Versions: 1.6.2
> Environment: Ubuntu
> Reporter: Miguel Ángel Francisco Fernández
> Priority: Blocker
> Labels: +, GET, REST, encode,
> Fix For: 1.6.2
>
> Original Estimate: 2h
> Remaining Estimate: 2h
>
> Using the wsdl2java tool to generate a Java client to access a REST web service described with a WSDL 2.0, the generated client does not encode the symbol '+' in GET parameters.
> For example, if I have an URL "/get_url", and I set the parameter "param" to "x+x", the symbol "+" is not encoded, and therefore it is interpreted as a space on the server ("x x"). If I try to send the parameter encoded, i.e., "%2B", then "%252B" is received in the server.
> Therefore, it is not possible to send the '+' symbol in a GET parameter.
> I guess that it is caused by the definition of the field LEGAL_CHARACTERS_IN_QUERY in the interface org.apache.axis2.description.WSDL2Constants, which is set to "-._~!$'()*+,;=:@/?"
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@axis.apache.org
For additional commands, e-mail: java-dev-help@axis.apache.org