Can a web service return a stream?

前端 未结 12 1724
眼角桃花
眼角桃花 2021-02-02 09:23

I\'ve been writing a little application that will let people upload & download files to me. I\'ve added a web service to this applciation to provide the upload/download fun

相关标签:
12条回答
  • 2021-02-02 09:56

    Apache CXF supports sending and receiving streams.

    0 讨论(0)
  • 2021-02-02 09:57

    When you use a standardized web service the sender and reciever do rely on the integrity of the XML data send from the one to the other. This means that a web service request and answer only are complete when the last tag was sent. Having this in mind, a web service cannot be treated as a stream.

    This is logical because standardized web services do rely on the http-protocol. That one is "stateless", will say it works like "open connection ... send request ... receive data ... close request". The connection will be closed at the end, anyway. So something like streaming is not intended to be used here. Or he layers above http (like web services).

    So sorry, but as far as I can see there is no possibility for streaming in web services. Even worse: depending on the implementation/configuration of a web service, byte[] - data may be translated to Base64 and not the CDATA-tag and the request might get even more bloated.

    P.S.: Yup, as others wrote, "chuinking" is possible. But this is no streaming as such ;-) - anyway, it may help you.

    0 讨论(0)
  • 2021-02-02 09:57

    I hate to break it to those of you who think a streaming web service is not possible, but in reality, all http requests are stream based. Every browser doing a GET to a web site is stream based. Every call to a web service is stream based. Yes, all. We don't notice this at the level where we are implementing services or pages because lower levels of the architecture are dealing with this for you - but it is being done.

    Have you ever noticed in a browser that sometimes it can take a while to fetch a page - the browser just keeps cranking away showing the hourglass? That is because the browser is waiting on a stream.

    Streams are the reason mime/types have to be sent before the actual data - it's all just a byte stream to the browser, it wouldn't be able to identify a photo if you didn't tell it what it was first. It's also why you have to pass the size of a binary before sending - the browser won't be able to tell where the image stops and the page picks up again.

    It's all just a stream of bytes to the client. If you want to prove this for yourself, just get a hold of the output stream at any point in the processing of a request and close() it. You will blow up everything. The browser will immediately stop showing the hourglass, and will display a "cannot find" or "connection reset at server" or some other such message.

    That a lot of people don't know that all of this stuff is stream based shows just how much stuff has been layered on top of it. Some would say too much stuff - I am one of those.

    Good luck and happy development - relax those shoulders!

    0 讨论(0)
  • 2021-02-02 09:58

    Keep in mind that a web service request basically boils down to a single HTTP POST.

    If you look at the output of a .ASMX file in .NET , it shows you exactly what the POST request and response will look like.

    Chunking, as mentioned by @Guvante, is going to be the closest thing to what you want.

    I suppose you could implement your own web client code to handle the TCP/IP and stream things into your application, but that would be complex to say the least.

    0 讨论(0)
  • 2021-02-02 10:04

    It's actually not that hard to "handle the TCP/IP and stream things into your application". Try this...

    class MyServlet extends HttpServlet
    {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
        {
            response.getOutputStream().println("Hello World!");
        }
    }
    

    And that is all there is to it. You have, in the above code, responded to an HTTP GET request sent from a browser, and returned to that browser the text "Hello World!".

    Keep in mind that "Hello World!" is not valid HTML, so you may end up with an error on the browser, but that really is all there is to it.

    Good Luck in your development!

    Rodney

    0 讨论(0)
  • 2021-02-02 10:06

    Yes, it is possible with Metro. See the Large Attachments example, which looks like it does what you want.

    JAX-WS RI provides support for sending and receiving large attachments in a streaming fashion.

    • Use MTOM and DataHandler in the programming model.
    • Cast the DataHandler to StreamingDataHandler and use its methods.
    • Make sure you call StreamingDataHandler.close() and also close the StreamingDataHandler.readOnce() stream.
    • Enable HTTP chunking on the client-side.
    0 讨论(0)
提交回复
热议问题