Open1

reqwestのresponseエラーチェック

yunayuna

jsonを返すapiをreqwestで読んで、responseを処理する事例。
いきなりresponse.json()を呼んでエラーチェックすると、response自体はmoveされてしまい、response内容をログに残せないので、
事前にerror_for_status_refで、statusチェック用のrefでresponseがエラーか否かをmatchでチェックし、処理を分岐させる。

let value: serde_json::Value = xxxxx;
let response = create_client()
        .post(&format!("{}/sample/api/path", API_BASE))
        .json(&value)
        .timeout(Duration::from_secs(120))
        .send()
        .await?;
    
    
    let status_ref = response.error_for_status_ref();
    match status_ref {
        Ok(_) => {
            match response.json::<serde_json::Value>().await {
                Ok(jsonData) => {
                    tracing::info!("response: {:?}", jsonData);
                    Ok(())
                },
                Err(e) => {
                    tracing::error!("can't parse response to json: {:?}", e);
                    Err(anyhow::Error::new(e))
                }
            }
        },
        Err(e) => {
            info!("response error.: {:?}, {:?}", e,  response);
            return Err(anyhow::Error::new(e))
        }
    }