pub struct Client { /* private fields */ }Expand description
Thin async HTTP client for the App Store Connect API. Handles JWT minting (cached and refreshed automatically) and JSON:API request/response plumbing.
Resource-specific calls live in the domain crates as extension traits on
this type: smbcloud-ascapi-aso for App Metadata, smbcloud-ascapi-signing
for certificates. Client::request, Client::request_no_content, and
Client::upload_bytes are the low-level seam those traits build on, and
are public for that reason rather than because callers should reach for
them directly.
Implementations§
Source§impl Client
impl Client
Sourcepub fn new(token_source: impl IntoTokenSource) -> Self
pub fn new(token_source: impl IntoTokenSource) -> Self
Build a client over anything that can mint a bearer token. An
ApiKey is the usual argument and still works
unchanged, since it converts into a TokenSource; a
StaticToken or any custom source works too.
Sourcepub fn with_base_url(self, base_url: impl Into<String>) -> Self
pub fn with_base_url(self, base_url: impl Into<String>) -> Self
Override the API host — only meaningful for pointing the client at a mock server in tests.
Sourcepub async fn request<B: Serialize, T: DeserializeOwned>(
&self,
method: Method,
path: &str,
query: &[(&str, &str)],
body: Option<&B>,
) -> Result<T>
pub async fn request<B: Serialize, T: DeserializeOwned>( &self, method: Method, path: &str, query: &[(&str, &str)], body: Option<&B>, ) -> Result<T>
Send a request and decode a JSON:API response body into T. Use
request_no_content instead for calls (typically DELETE) that
return an empty 204 body.
Sourcepub async fn list_all<A>(
&self,
path: &str,
query: &[(&str, &str)],
) -> Result<Vec<Resource<A>>>where
A: DeserializeOwned,
pub async fn list_all<A>(
&self,
path: &str,
query: &[(&str, &str)],
) -> Result<Vec<Resource<A>>>where
A: DeserializeOwned,
Read an entire collection by following links.next, so a caller sees
every row rather than Apple’s first page.
path/query describe the first page only. Each later page is
requested from the absolute links.next Apple returns, which already
carries the original include/filter/limit alongside its cursor —
re-appending query there would duplicate every parameter.
No page size is chosen here. Apple’s per-collection maximums differ and
only the caller knows which collection it is reading; picking a size
shapes the request, where following the cursor does not. Callers that
want 200-row pages pass ("limit", "200") in query, as they already
do.
Sourcepub async fn request_no_content<B: Serialize>(
&self,
method: Method,
path: &str,
query: &[(&str, &str)],
body: Option<&B>,
) -> Result<()>
pub async fn request_no_content<B: Serialize>( &self, method: Method, path: &str, query: &[(&str, &str)], body: Option<&B>, ) -> Result<()>
Send a request that returns no body on success (typically DELETE).
Sourcepub async fn request_bytes<B: Serialize>(
&self,
method: Method,
path: &str,
query: &[(&str, &str)],
body: Option<&B>,
headers: &[(&str, &str)],
) -> Result<Vec<u8>>
pub async fn request_bytes<B: Serialize>( &self, method: Method, path: &str, query: &[(&str, &str)], body: Option<&B>, headers: &[(&str, &str)], ) -> Result<Vec<u8>>
Send an authenticated request whose successful response is raw bytes. Domain APIs use this for endpoints such as sales reports that return a compressed file instead of a JSON:API document.
Sourcepub async fn upload_bytes(
&self,
method: Method,
url: &str,
headers: &[(String, String)],
body: Vec<u8>,
) -> Result<()>
pub async fn upload_bytes( &self, method: Method, url: &str, headers: &[(String, String)], body: Vec<u8>, ) -> Result<()>
PUTs a raw byte body to a pre-signed asset-upload URL (as returned by
e.g. appScreenshots.uploadOperations). Unlike Client::request,
this does not prefix base_url or attach the ASC bearer token —
upload URLs are pre-signed and carry their own auth in
request_headers; sending our JWT alongside would be wrong for a
host that isn’t api.appstoreconnect.apple.com.