Forum Discussion

pwd's avatar
pwd
Occasional Contributor
5 years ago

Configurable option for generating body content in Post requests

Hi,

I'm creating a simple REST service. I figured I'd use JAX-RS. I've generated my API and the documentation looks good.

I'm having trouble modifying the generated JAX-RS code (I'm using Jersey/Jetty) to retrieve 'body' parameters properly. If they're sent in a single packet with the request, the stub is invoked OK. If the body comes in another packet, however, Jetty dispatches the call as soon as the headers are complete and my server stub is invoked with a "null" parameter that should've been retrieved from the HTTP body.

Is there any good JAX-RS sample code that actually properly retrieves a 'body' parameter for use? Is there anything special my code needs to do if the passed function parameter is "null"? Am I supposed to be writing code to retrieve it from the body once that actually arrives, and block until then somehow?

Any pointers to complete sample code (that don't just return"Magic!" without looking at the parameters...) would be much appreciated!

Thanks!
-Patrick.

5 Replies

  • hello pwd

     

    can you please share more details? such as codegen version you use, also what jax-rs language (in codegen options) are you using to generated code? and if it's possible, share the api documentation used on your sample

    • hugomario's avatar
      hugomario
      Staff

      do you think you can share client code or part of the client code used to invoke request ?

      • pwd's avatar
        pwd
        Occasional Contributor
         

        Sure - I use a C++ tool using cpprest stubs generated from the same API.  The calling code looks as follows (let me know if there are other parts of interest):

         

        	std::shared_ptr<ApiConfiguration> apiConfig = std::make_shared<ApiConfiguration>();
        	apiConfig->setUserAgent("Agent-42");
        	apiConfig->setBaseUrl("http://XXX:8080/XXX/XXX-backend/1.0");
        	std::shared_ptr<ApiClient> apiClient = std::make_shared<ApiClient>();
        	apiClient->setConfiguration(apiConfig);
        	std::shared_ptr<HostManagementApi> hostMgmtApi = std::make_shared<HostManagementApi>(apiClient);
        	std::shared_ptr<HostSpec> hs = std::make_shared<HostSpec>();
        	hs->setHostId(hostID);
        	pplx::task<std::shared_ptr<Empty_success_response>> requestTask = hostMgmtApi->addHost(hs);
        	requestTask.then([=](pplx::task<std::shared_ptr<Empty_success_response>> task) {
        		fprintf(stderr, "Task completed; collecting response...\n");
        		try
        		{
        			std::shared_ptr<Empty_success_response> response = task.get();
        		}
        		catch (const std::exception &e)
        		{
        			printf("Error exception during task.get(): %s\n", e.what());
        		}
        	});
        

         

    • pwd's avatar
      pwd
      Occasional Contributor

      I'm just using whatever codegen version is current on Swaggerhub, which I'm using for development.  I exported the server stubs for plain "jaxrs", IIRC.

       

      Again, the strange part is that the whole operation works fine end-to-end if the body is included in the original request packet; it's when the body is sent in a separate packet that the API is just called with a "null" value for a required [body] parameter.

       

      I'm having some trouble accessing the API through Swaggerhub at the moment but the API definition (in the original yaml) for the Swagger 2.0 version of the API, was as follows:

       

      swagger: '2.0'
      info:
        version: '1.0'
        title: '...'
      ...
        HostSpec:
          type: object
          required:
            - host-id
          properties:
            host-id:
              type: string
      ...
      paths:
        /hosts:
       ...
          put:
            description: ...
            tags:
              - Host Management
            operationId: AddHost
            consumes:
              - application/json
              - application/xml
            produces:
              - application/json
              - application/xml
            parameters:
              - name: HostSpec
                description: ...
                in: body
                schema:
                  $ref: '#/definitions/HostSpec'
                required: true
            responses:
              200:
                description: Successful operation
                schema:
                  $ref: '#/definitions/empty-success-response'
       ...

       

      Let me know if there's anything else of possible interest?

       

      Thanks a lot,

      -Patrick.