C# client examples.
Changes
2023-06-22:
- Supports error descriptions in response body, to match the updated HTTP server code.
- Some functions renamed.
- Changed the type of parameters. Was tuple ("name", "value"), now string "name=value".
- And more improvements.
using System.Net.Http;
#region examples
LaHttp.Call("Simple"); //"http://localhost:4455/Simple"
LaHttp.Call("http://:password278351@localhost:4455/Simple");
string s1 = LaHttp.CallS("Returns");
print.it(s1);
LaHttp.Call("Parameters", "a=aa", "c=10", "d=true");
int i1 = 3, i2 = 4;
int i3 = LaHttp.CallS("Add", $"x={i1}", $"y={i2}").ToInt();
print.it(i3);
POINT p1 = new POINT(2, 3);
POINT p2 = LaHttp.CallJ("Json", p1).Json<POINT>();
print.it(p2);
#endregion
/// <summary>
/// Calls C# functions on a computer where <see href="https://www.libreautomate.com/forum/showthread.php?tid=7468">LibreAutomate HTTP server</see> is running.
/// </summary>
/// <example>
/// <code><![CDATA[
/// LaHttp.Call("Simple"); //"http://localhost:4455/Simple"
///
/// LaHttp.Call("http://:password278351@localhost:4455/Simple");
///
/// string s1 = LaHttp.CallS("Returns");
/// print.it(s1);
///
/// LaHttp.Call("Parameters", "a=aa", "c=10", "d=true");
///
/// int i1 = 3, i2 = 4;
/// int i3 = LaHttp.CallS("Add", $"x={i1}", $"y={i2}").ToInt();
/// print.it(i3);
///
/// POINT p1 = new POINT(2, 3);
/// POINT p2 = LaHttp.CallJ("Json", p1).Json<POINT>();
/// print.it(p2);
/// ]]></code>
/// </example>
public class LaHttp {
/// <summary>
/// Calls a function with 0 or more parameters.
/// </summary>
/// <param name="url">
/// URL like "http://HOST:4455/FunctionName".
/// <br/>• HOST can be: localhost (this computer); IP; LAN computer name; web server (like www.example.com).
/// <br/>• Password can be specified like "http://:password@HOST:4455/FunctionName".
/// <br/>• If the HTTP server is on the same computer and don't need a password, can be just function name.
/// </param>
/// <param name="a">Parameter like <c>"name=value"</c>.</param>
public static HttpResponseMessage Call(string url, params string[] a) {
_Url(ref url, out var auth);
var c = new MultipartFormDataContent();
foreach (var s in a) {
string n, v;
int i = s.IndexOf('='); if (i < 1) throw new ArgumentException("Expected \"name=value\"", "a");
n = s[..i]; v = s[++i..];
if (n[0] == '@') c.AddFile(n[1..], v); else c.Add(n, v);
}
return _Post(url, c, auth);
}
/// <summary>
/// Calls a function and passes an object of any type converted to JSON.
/// </summary>
/// <inheritdoc cref="Call(string, string[])"/>
public static HttpResponseMessage CallJ<T>(string url, T x) {
_Url(ref url, out var auth);
return _Post(url, internet.jsonContent(x), auth);
}
static void _Url(ref string url, out string auth) {
auth = null;
if (!url.RxIsMatch("^https?://")) url = "http://localhost:4455/" + url;
else if (url.RxMatch(@"^https?://(.*?:.*?)@", 1, out RXGroup g)) { auth = g.Value; url = url.Remove(g.Start, g.Length + 1); }
}
static HttpResponseMessage _Post(string url, HttpContent c, string auth) {
var r = internet.http.Post(url, c, auth: auth);
if (!r.IsSuccessStatusCode) {
var text = r.Text(ignoreError: true);
if (text.NE()) r.EnsureSuccessStatusCode();
else throw new HttpRequestException($"Status {(int)r.StatusCode}. {text}", null, r.StatusCode);
}
return r;
}
/// <summary>
/// Calls a function with 0 or more parameters, and returns the response text.
/// </summary>
/// <inheritdoc cref="Call(string, string[])"/>
public static string CallS(string url, params string[] a)
=> Call(url, a).Text();
/// <summary>
/// Calls a function, passes an object of any type converted to JSON, and returns the response text.
/// </summary>
/// <inheritdoc cref="Call(string, string[])"/>
public static string CallJS<T>(string url, T x) //note: not CallS overload. Then goes here if single parameter.
=> CallJ(url, x).Text();
//rejected. It's easier to use code Call(...).Json<TReturn>();.
//public static TReturn CallJJ<TParam, TReturn>(string url, TParam x)
// => Call(url, x).Json<TReturn>();
}
Changes
2023-06-22:
- Supports error descriptions in response body, to match the updated HTTP server code.
- Some functions renamed.
- Changed the type of parameters. Was tuple ("name", "value"), now string "name=value".
- And more improvements.