HTTP-RPC 4.2 Released

HTTP-RPC 4.2 is now available for download, as well as via Cocoapods for iOS and Maven for Java:

<dependency>
    <groupId>org.httprpc</groupId>
    <artifactId>httprpc</artifactId>
    <version>...</version>
</dependency>

This release includes the following updates:

  • Refine invocation methods for Swift. Invocation methods are now parameterized, so it is no longer necessary to cast the return value to the desired type:
    open func invoke<T>(_ method: String, path: String, 
        resultHandler: @escaping (T?, Error?) -> Void) -> URLSessionTask? { ... }
    
    open func invoke<T>(_ method: String, path: String, arguments: [String: Any], 
        resultHandler: @escaping (T?, Error?) -> Void) -> URLSessionTask? { ... }

    For example:

    serviceProxy.invoke("GET", path: "/example") { (result: UIImage?, error) in
        // Handle image result
    }
  • Add support for custom response handlers. Callers can now perform custom deserialization via a response handler callback. In Swift, the callback is a closure:
    open func invoke<T>(_ method: String, path: String, arguments: [String: Any],
        responseHandler: @escaping (Data, String) throws -> T?,
        resultHandler: @escaping (T?, Error?) -> Void) -> URLSessionTask? { ... }

    For example (using JSONDecoder to return a strongly typed result):

    serviceProxy.invoke("GET", path: "/example", arguments: [:], responseHandler: { data, contentType in
        let decoder = JSONDecoder()
    
        return try? decoder.decode(Example.self, from: data)
    }) { (result: Example?, error) in
        // Handle custom result
    }

    In Java, the callback is defined as follows:

    public interface ResponseHandler<V> {
        public V decode(InputStream inputStream, String contentType) throws IOException;
    }

    For example (using Jackson to return a strongly typed result):

    serviceProxy.invoke("GET", "/example", mapOf(), (inputStream, contentType) -> {
        ObjectMapper objectMapper = new ObjectMapper();
    
        return objectMapper.readValue(input, Example.class);
    }, (Example result, Exception exception) -> {
        // Handle custom result
    });    

For more information, see the project README.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s