Go HTTP Client
This example is a WebAssembly component that calls a random number generator service to get random numbers.
The application...
- Implements a
wasi:http-compliant HTTP handler - Uses the
httpserverprovider to serve requests - Can be declaratively provisioned in a wasmCloud environment
📦 Dependencies
[!WARNING] Due to incompatibilities introduced in
wasm-toolsv1.226.0, a version ofwasm-tools<= 1.225.0 is required for running this example.You can install
wasm-toolsv1.225.0 from upstream releases, or usecargo(Rust toolchain) -- (i.e.cargo install --locked wasm-tools@1.225.0)
Before starting, ensure that you have the following installed in addition to the Go (1.23+) toolchain:
tinygofor compiling Go (always use the latest version)wasm-toolsfor Go bindings- wasmCloud Shell (
wash) for building and running the components and wasmCloud environment
👟 Run the example
Clone the wasmCloud/go repository:
git clone https://github.com/wasmCloud/go.gitChange directory to examples/component/http-client:
cd examples/component/http-clientIn addition to the standard elements of a Go project, the example directory includes the following files and directories:
build/: Target directory for compiled.wasmbinariesgen/: Target directory for Go bindings of interfaceswit/: Directory for WebAssembly Interface Type (WIT) packages that define interfaceswadm.yaml: Declarative application manifestwasmcloud.lock: Automatically generated lockfile for WIT packageswasmcloud.toml: Configuration file for a wasmCloud application
Start a local development loop
Run wash dev to start a local development loop:
wash devThe wash dev command will:
- Start a local wasmCloud environment
- Build this component
- Deploy your application and all requirements to run the application locally, including...
- Your locally built component
- The HTTP server provider, which will receive requests from the outside world (on port 8000 by default)
- The HTTP client provider, which will call a random number generator service
- Necessary links between providers and your component so your component can handle web traffic
- Watch your code for changes and re-deploy when necessary.
Once the application is deployed, open another terminal tab. To ensure that the application has reached Deployed status, you can use wash app list:
wash app listSend a request
When you send a request, the component will call an upstream API and return a list of random numbers:
curl localhost:8000[438,424,166,260,681]Clean up
You can stop the wash dev process with Ctrl-C.
⚠️ Issues/FAQ
curl produces a "failed to invoke" error
If curling produces...
failed to invoke `wrpc:http/incoming-handler.handle`: failed to invoke `wrpc:http/incoming-handler@0.1.0.handle`: failed to shutdown synchronous parameter channel: not connected%...the HTTP server may not have finished starting up. You can check that the application has reached Deployed status with wash app list.
If the issue persists, you may have a lingering HTTP server provider running on your system. You can use pgrep to check:
pgrep -la ghcr_io4007604 /tmp/wasmcloudcache/NBCBQOZPJXTJEZDV2VNY32KGEMTLFVP2XJRZJ5FWEJJOXESJXXR2RO46/ghcr_io_wasmcloud_http_server_0_23_1📖 Further reading
For more on building components, see the Component Developer Guide in the wasmCloud documentation.