I have now generated the httpbindings using wsdl2java with a version 2.0 wsdl and the operation has been added to the EPR as desired and I can do POST getGigsIn("London"), POST getMostActiveArtist() and GET getMostActiveArtist() without any problems which is great. The headers for both GET and POST are also now the same (see below) which makes a lot more sense to me. Content-Type: application/xml; charset=UTF-8 SOAPAction: ""
However, when I try to do GET getGigsIn("London") I get the error <faultstring>unknown</faultstring>. The request according to TCPmon is: GET /NicksGigs-war-Axis2/services/GigListingsService/NicksGigsServiceV2/getGigsIn HTTP/1.1 Content-Type: application/xml; charset=UTF-8 SOAPAction: "" User-Agent: Axis2 Host: 10.4.39.241:8089 The operation is there in the URL but the parameter "London" is not so it's obviously not going to work. I was expecting something more like GET /NicksGigs-war-Axis2/services/GigListingsService/NicksGigsServiceV2/getGigsIn?city=London HTTP/1.1 Whats going wrong here? Also, just to see what would happen, I tried to make some httpbindings using a version 1.1 wsdl but the generated stub had methods like void getGigsIn() and void getMostActiveArtist() which don't take or return any values so I couldn't work out how I could possibly use them. Is this normal or is this the reason you said to use a version 2.0 wsdl? Cheers, Nick keith chapman wrote: > > On Tue, Sep 2, 2008 at 2:11 AM, Nick Steel > <[EMAIL PROTECTED]> wrote: >> >> Keith, >> >> I had no idea ?wsdl2 even existed, > > Axis2 supports both WSDL 1.1 and WSDL 2.0. And the WSDL 2.0 > HTTPBinding can describe a REST interface for your service in a nice > manner. > > I've no idea how I managed to miss this >> but I will hunt for it tomorrow and give it a go. Thanks very much this >> reply, what you say aout the EPR has definitely cleared some things up >> for >> me and hopefully I can now go on to get this to work. >> >> Just to be clear though, you say I should generate the client stub for >> the >> httpbinding, how exactly do I do this? I thought the stub I already had >> could handle all the bindings in my wsdl and that setting the portal >> parameters was what controlled which binding was being used. Is this >> wrong? > > When codegeneration is used to generate the server side code its only > the portType (or the interface if WSDL 2.0) that we care about when > generating code. But when its generating code for the client side we > generate it for a particular port and you can specify this by using > the -pn option. If a port if not provided it faults to use the first > SOAP 1.2 port it finds. You could generate code for all ports too this > can be done by using the -ap options. This will generate stubs for all > ports in the WSDL. So for example if I take the same RESTSample that I > used yesterday this is how I would generate code for its HTTPBinding. > > wsdl2java.sh -uri http://mooshup.com/services/samples/RESTSample?wsdl2 > -pn HTTPEndpoint -wv 2 > > I use "-wv 2" to specify that this is indeed a WSDL 2.0 file. > > Thanks, > Keith. >> >> Cheers, >> Nick >> >> >> keith chapman wrote: >>> >>> Hi Nick, >>> >>> If you want to invoke a service using REST then its better to generate >>> the client stub for the httpBinding (and when doing so I recommend you >>> to use ?wsdl2 instead of ?wsdl). This is what describes the REST >>> interface of the service. This is where it will contain details of the >>> URL the operation is available at hence if this binding is used to >>> invoke the service it will automatically add the operation name to the >>> end of the EPR. This does not happen for the SOAP bindings though. >>> This is the reason for the behavior you observed below. >>> >>> In the request you have sent below does not contain enough information >>> to dispatch it to the correct operation of the service. If you had the >>> operation name at the end of it it would have worked. And BTW when you >>> are using service client directly it will not append the operation >>> name to the EPR. Note that you have to configure the ServiceClient >>> your self when using this. (This is not the case for stubs generated >>> for the httpBinding though). >>> >>> On Mon, Sep 1, 2008 at 9:07 PM, Nick Steel >>> <[EMAIL PROTECTED]> wrote: >>>> >>>> Thank you Jay and Keith for your replies. I've upgraded to version >>>> 1.4.1 >>>> but >>>> this had made no difference. Below is a really simple version of my >>>> code >>>> taking the options used by Jay in his working service but I can still >>>> only >>>> get the correct response using getGigsIn() with POST, every other >>>> combination else fails with: >>>> <soapenv:Reason >>>> xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> >>>> <soapenv:Text xml:lang="en-US">The endpoint reference (EPR) for >>>> the >>>> Operation not found is /NicksGigs-war-Axis2/services/GigListingsService >>>> and >>>> the WSA Action = null</soapenv:Text></soapenv:Reason>" >>>> >>>> SimpleREST.java: >>>> String epr = >>>> "http://localhost:8089/NicksGigs-war-Axis2/services/GigListingsService"; >>>> NicksGigsServiceStub portal = new NicksGigsServiceStub(epr); >>>> Options options = portal._getServiceClient().getOptions(); >>>> options.setProperty(Constants.Configuration.ENABLE_REST, Boolean.TRUE); >>>> options.setProperty(Constants.Configuration.HTTP_METHOD, >>>> Constants.Configuration.HTTP_METHOD_POST); >>>> options.setProperty(Constants.Configuration.MESSAGE_TYPE, >>>> //org.apache.axis2.transport.http.HTTPConstants.MEDIA_TYPE_X_WWW_FORM); >>>> //options.setProperty(Constants.Configuration.DISABLE_SOAP_ACTION, >>>> Constants.VALUE_TRUE); >>>> options.setCallTransportCleanup(true); >>>> options.setTransportInProtocol(Constants.TRANSPORT_HTTP); >>>> portal._getServiceClient().setOptions(options); >>>> Gig[] results = portal.getGigsIn("London"); >>>> for (int j = 0; j < results.length; j++) >>>> System.out.println(results[j].getToString()); >>>> >>>> Note that I had to comment out the MESSAGE_TYPE property for this to >>>> work. I >>>> have also commented out the SOAP_ACTION property here since although it >>>> did >>>> remove the action(s) in the header it didn't make any difference to the >>>> end >>>> result. >>>> >>>> The thing which strikes me most about this is that whether using GET or >>>> POST >>>> the bindings do not append the method names to the endpoint like I >>>> would >>>> expect them to. I wrongly assumed that at some point the axis >>>> generated >>>> code would do something like endpoint+"/"+methodName but it doesn't >>>> seem >>>> to... Is this correct behaviour? >>>> >>>> I took a look at the blog entry and after a closer look at my WSDL it >>>> seems >>>> that the one generated at >>>> ...NicksGigs-war-Axis2/services/GigListingsService?wsdl has the correct >>>> parameter names, but the wsdl generated by the maven java2wsdl plugin >>>> and >>>> then subsequently used by wsdl2java to create my stub has the param0, >>>> param1 >>>> names. Maven automatically compiles with debug on and I've made no >>>> changes >>>> to this so I am a bit confused why I'm getting this. Even more so by >>>> the >>>> fact that if I create unwrapped bindings then the correct parameter >>>> names >>>> are used. >>> >>> This is strange. I haven't tried this out though (wsdl2java maven >>> plugin). Would give it a try and let you know. >>> >>> Thanks, >>> Keith. >>>> >>>> Thanks >>>> Nick >>>> >>>> >>>> >>>> >>>> >>>> keith chapman wrote: >>>>> >>>>> Hi Nick, >>>>> >>>>> Sorry I couldn't get back to you sooner. Was held up with some travel >>>>> last week. So here goes, see my comments inline. (As a summary could >>>>> you try this with 1.4.1 as I did fix some REST bugs for this release) >>>>> >>>>> On Thu, Aug 21, 2008 at 6:12 PM, Nick Steel >>>>> <[EMAIL PROTECTED]> wrote: >>>>>> >>>>>> Hi, >>>>>> >>>>>> I've recently started looking at using the REST support in Axis2 to >>>>>> invoke >>>>>> my web service instead of the currently used SOAP calls and I have a >>>>>> number >>>>>> of issues I can't work out for myself. Any help with these would be >>>>>> great. >>>>>> I've been using Axis2 version 1.3 (and then also tried 1.4 in the >>>>>> hope >>>>>> my >>>>>> issues would be solved) and tcpmon to monitor the traffic between my >>>>>> test >>>>>> client and my service running locally on tomcat at > >>>>>> http://localhost:8080/NicksGigs-war-Axis2/services/GigListingsService. >>>>>> The >>>>>> WSDL is created using java2wsdl and is attached. >>>>>> >>>>>> I've read in another (old) post here that Axis2 is just a soap stack >>>>>> and >>>>>> any >>>>>> incoming rest style messages are converted into soap messages first >>>>>> so >>>>>> that >>>>>> they can then be processed. Is this still the case? >>>>> >>>>> Yes. Axis2 is primarily a SOAP engine and hence once a message gets >>>>> into axis2 it has a SOAP message. So when Axis2 receives a REST >>>>> message we do create a SOAP message out of it. >>>>> >>>>> Does this have a >>>>>> performance hit? Is there anything in the documentation about this? >>>>>> >>>>>> >>>>>> I'm using (unwrapped) ADB bindings generated by wsdl2java for my test >>>>>> client, to use the rest style web calls with the bindings is it >>>>>> simply >>>>>> a >>>>>> case of adding the line of code below into my client? >>>>>> options.setProperty(Constants.Configuration.ENABLE_REST, >>>>>> Constants.VALUE_TRUE); >>>>>> I want to clarify this since all the examples I have seen do not use >>>>>> bindings. >>>>>> >>>>>> >>>>>> Is it possible to use both POST and GET when my operation parameters >>>>>> are >>>>>> all >>>>>> simple types? To change between the two transports is it simply a >>>>>> case >>>>>> of >>>>>> options.setProperty(Constants.Configuration.HTTP_METHOD, >>>>>> HTTP_METHOD_GET); >>>>>> Or >>>>>> options.setProperty(Constants.Configuration.HTTP_METHOD, >>>>>> HTTP_METHOD_POST); >>>>>> ? >>>>> >>>>> Yes you could set the HTTP Method you need as explained above. Axis2 >>>>> also supports PUT and DELETE. >>>>>> >>>>>> >>>>>> I've found that I can use POST with operations that have parameters >>>>>> but >>>>>> not >>>>>> on those without parameters. For example, a call to >>>>>> getGigsIn("London") >>>>>> using HTTP_POST makes the following successful request: >>>>>> POST /NicksGigs-war-Axis2/services/GigListingsService HTTP/1.1 >>>>>> Content-Type: application/xml; charset=UTF-8 >>>>>> SOAPAction: urn:getGigsIn >>>>>> User-Agent: Axis2 >>>>>> Content-Length: 115 >>>>>> >>>>>> <ns2:getGigsIn >>>>>> xmlns:ns2="http://NicksGigs.nsteel.qis.qualcomm.com"><ns2:param0>London</ns2:param0></ns2:getGigsIn> >>>>>> >>>>>> But a call to getMostActiveArtist() makes the following unsuccessful >>>>>> request: >>>>>> POST /NicksGigs-war-Axis2/services/GigListingsService HTTP/1.1 >>>>>> Content-Type: application/xml; charset=UTF-8 >>>>>> SOAPAction: urn:getMostActiveArtist >>>>>> User-Agent: Axis2 >>>>>> Content-Length: 0 >>>>>> >>>>>> with received error: >>>>>> <faultstring>The endpoint reference (EPR) for the Operation not found >>>>>> is >>>>>> /NicksGigs-war-Axis2/services/GigListingsService and the WSA Action = >>>>>> null</faultstring> >>>>>> >>>>>> Why doesn't this work?? >>>>>> >>>>>> >>>>>> After setting the HTTP_METHOD to HTTP_GET I am unable to make any >>>>>> successful >>>>>> calls to my service. getGigsIn("London") gives: >>>>>> GET /NicksGigs-war-Axis2/services/GigListingsService?param0=London >>>>>> HTTP/1.1 >>>>>> Content-Type: application/x-www-form-urlencoded; >>>>>> charset=UTF-8;action="urn:getGigsIn"; >>>>>> SOAPAction: urn:getGigsIn >>>>>> User-Agent: Axis2 >>>>>> >>>>>> <soapenv:Reason >>>>>> xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Text >>>>>> xml:lang="en-US">The endpoint reference (EPR) for the Operation not >>>>>> found >>>>>> is >>>>>> /NicksGigs-war-Axis2/services/GigListingsService and the WSA Action = >>>>>> null</soapenv:Text></soapenv:Reason> >>>>>> >>>>>> while getMostActiveArtist() gives: >>>>>> GET /NicksGigs-war-Axis2/services/GigListingsService HTTP/1.1 >>>>>> Content-Type: application/x-www-form-urlencoded; >>>>>> charset=UTF-8;action="urn:getMostActiveArtist"; >>>>>> SOAPAction: urn:getMostActiveArtist >>>>>> User-Agent: Axis2 >>>>>> >>>>>> And the same error response. >>>>>> >>>>>> Shouldn't the bindings be appending the operation name onto the end >>>>>> of >>>>>> the >>>>>> endpoint for me? If I explicitly set the endpoint to >>>>>> http://localhost:8080/NicksGigs-war-Axis2/services/GigListingsService/getGigsIn >>>>>> it makes the following request: >>>>>> GET >>>>>> /NicksGigs-war-Axis2/services/GigListingsService/getGigsIn?param0=London >>>>>> HTTP/1.1 >>>>>> Content-Type: application/x-www-form-urlencoded; >>>>>> charset=UTF-8;action="urn:getGigsIn"; >>>>>> SOAPAction: urn:getGigsIn >>>>>> User-Agent: Axis2 >>>>>> >>>>>> Which still gives an error, but this time: >>>>>> <soapenv:Reason >>>>>> xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Text >>>>>> xml:lang="en-US">Exception occurred while trying to invoke service >>>>>> method >>>>>> getGigsIn</soapenv:Text></soapenv:Reason> >>>>>> >>>>>> If I simply go to >>>>>> http://localhost:8080/NicksGigs-war-Axis2/services/GigListingsService/getGigsIn?city=London >>>>>> in my browser I get the correct response. >>>>> >>>>> The above should work for you correctly with codegenerated stubs. Can >>>>> you try this with Axis2 -1.4.1 please. I fixed some bugs on REST >>>>> invocation for this release and verified that these stuff work. >>>>>> >>>>>> For me, one of the advantages of the generated bindings is not having >>>>>> to >>>>>> worry about the contents of the WSDL; I shouldn't have to know that >>>>>> the >>>>>> WSDL >>>>>> says I must specify the "city" parameter in my query string for the >>>>>> getGigsIn operation. Why are my ADB bindings setting "param0" >>>>>> instead? >>>>> >>>>> This blog entry (http://wso2.org/blog/sumedha/3727) gives you the >>>>> answer to this. >>>>>> >>>>>> >>>>>> Finally, the documentation specifies that Axis2 determines if an >>>>>> incoming >>>>>> message is REST or SOAP by checking if "the content type is text/xml >>>>>> and >>>>>> if >>>>>> the SOAPAction Header is missing". If you examine the requests the >>>>>> following headers are present for each method. >>>>>> HTTP_GET: Both SOAPAction and "action" in Content-Type >>>>>> HTTP_POST: Just SOAPAction >>>>>> SOAP: Just "action" in Content-Type >>>>>> >>>>>> What is going on here, are these the correct headers? And what is the >>>>>> "SOAPAction Header", is it "SOAPAction" or is it "action" in >>>>>> Content-Type!? >>>>>> I also found that when using POST I can even remove the SOAPAction >>>>>> header >>>>>> but providing I ensure the Content-Type still contains >>>>>> "application/xml" >>>>>> I >>>>>> will still receive the correct (non-soap) response from the service. >>>>>> >>>>>> >>>>>> I'm aware I might be doing something fundamentally wrong on the >>>>>> client >>>>>> side >>>>>> (maybe you can't use ADB bindings?) to get these results and I'd be >>>>>> very >>>>>> grateful for any responses to any of these questions. >>>>> >>>>> You can use codegenerated stub to invoke REST services. >>>>> >>>>> Thanks, >>>>> Keith. >>>>>> >>>>>> Thanks, >>>>>> Nick >>>>>> http://www.nabble.com/file/p19087933/example.wsdl example.wsdl >>>>>> -- >>>>>> View this message in context: >>>>>> http://www.nabble.com/Axis2-REST-client-and-server-questions-%28Data-bindings%2C-Headers%2C-Performance%29-tp19087933p19087933.html >>>>>> Sent from the Axis - User mailing list archive at Nabble.com. >>>>>> >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>>>> >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Keith Chapman >>>>> Senior Software Engineer >>>>> WSO2 Inc. >>>>> Oxygenating the Web Service Platform. >>>>> http://wso2.org/ >>>>> >>>>> blog: http://www.keith-chapman.org >>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>>> >>>>> >>>>> >>>> >>>> -- >>>> View this message in context: >>>> http://www.nabble.com/Axis2-REST-client-and-server-questions-%28Data-bindings%2C-Headers%2C-Performance%29-tp19087933p19256708.html >>>> Sent from the Axis - User mailing list archive at Nabble.com. >>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>>> For additional commands, e-mail: [EMAIL PROTECTED] >>>> >>>> >>> >>> >>> >>> -- >>> Keith Chapman >>> Senior Software Engineer >>> WSO2 Inc. >>> Oxygenating the Web Service Platform. >>> http://wso2.org/ >>> >>> blog: http://www.keith-chapman.org >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>> For additional commands, e-mail: [EMAIL PROTECTED] >>> >>> >>> >> >> -- >> View this message in context: >> http://www.nabble.com/Axis2-REST-client-and-server-questions-%28Data-bindings%2C-Headers%2C-Performance%29-tp19087933p19260445.html >> Sent from the Axis - User mailing list archive at Nabble.com. >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> > > > > -- > Keith Chapman > Senior Software Engineer > WSO2 Inc. > Oxygenating the Web Service Platform. > http://wso2.org/ > > blog: http://www.keith-chapman.org > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > -- View this message in context: http://www.nabble.com/Axis2-REST-client-and-server-questions-%28Data-bindings%2C-Headers%2C-Performance%29-tp19087933p19274912.html Sent from the Axis - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]