/// <summary> /// Converts JSON to a application/x-www-form-urlencoded before POSTing to the Postmates API. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="url"></param> /// <param name="_object"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task <T> PostFormAsync <T>(string url, dynamic _object, CancellationToken cancellationToken = default) { var payloadString = ""; var first = true; //dynamic data = JObject.Parse(_object); dynamic data = JObject.FromObject(_object); foreach (var descriptor in TypeDescriptor.GetProperties(data)) { var key = descriptor.Name; var value = descriptor.GetValue(data).Value; if (value is null) { continue; } if (!(value is string)) { value = (descriptor.GetValue(data) == null) ? null : JsonConvert.SerializeObject(descriptor.GetValue(data), Newtonsoft.Json.Formatting.None, _jsonSettings); value = (string)value.Trim('"'); } if (!string.IsNullOrEmpty(value)) { if (!first) { payloadString += "&"; } payloadString += $"{key}={value}"; first = false; } } var payload = new JsonClientPayload("application/x-www-form-urlencoded", payloadString); var response = await _jsonClient.PostUnsafeAsync(url, payload); if (response.IsSuccess) { return(response.As <T>()); } else { var args = response.As <PostmatesExceptionArgs>(); throw PostmatesExceptionThrower.GetException(args); } }
public async Task Post_CustomPayloadAsync() { // Ensure that POST uploading a [JsonCustomPayload] works. using (new MockHttpServer(baseUri, async context => { var request = context.Request; var response = context.Response; if (request.Method != "POST") { response.StatusCode = (int)HttpStatusCode.MethodNotAllowed; return; } if (request.Path.ToString() != "/info") { response.StatusCode = (int)HttpStatusCode.NotFound; return; } Assert.Equal("application/x-www-form-urlencoded", request.ContentType); Assert.Equal("key1=value1&key2=value2", request.GetBodyText()); var output = new ReplyDoc() { Value1 = "Hello World!" }; response.ContentType = "application/json"; await response.WriteAsync(NeonHelper.JsonSerialize(output)); })) { using (var jsonClient = new JsonClient()) { var doc = new JsonClientPayload("application/x-www-form-urlencoded", "key1=value1&key2=value2"); await jsonClient.PostAsync(baseUri + "info", doc); } }; }
public async Task OptionsAsync_NullPayloadAsync() { // Ensure that OPTIONS uploading a NULL payload works. using (new MockHttpServer(baseUri, async context => { var request = context.Request; var response = context.Response; if (request.Method != "OPTIONS") { response.StatusCode = (int)HttpStatusCode.MethodNotAllowed; return; } if (request.Path.ToString() != "/info") { response.StatusCode = (int)HttpStatusCode.NotFound; return; } var output = new ReplyDoc() { Value1 = "Hello World!" }; response.ContentType = "application/json"; await response.WriteAsync(NeonHelper.JsonSerialize(output)); })) { using (var jsonClient = new JsonClient()) { var doc = new JsonClientPayload("application/x-www-form-urlencoded", "key1=value1&key2=value2"); await jsonClient.OptionsAsync(baseUri + "info", doc); } }; }