I'm writing a plug-in to send a PATCH request to the REST API whenever a new opportunity is created. But I keep getting the same error "400 Bad Request". However, I tested the URL in POSTMAN and it works fine. This is my code (the plug-in will call this method):
private async void MakeRequest(string requestUrl, ITracingService tracingService)
{
try
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(requestUrl);
client.DefaultRequestHeaders
.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.TryAddWithoutValidation("Ocp-Apim-Subscription-Key", subscriptionKey);
HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("PATCH"), "relativeAddress");
request.Content = new StringContent("{\"op\":\"replace\",\"path\":\"prescriptive-actions/status\",\"value\":\"Completed\",\"from\":\"New\"}", Encoding.UTF8, "application/json");
tracingService.Trace("requestUrl {0}", requestUrl);
var task = client.SendAsync(request)
.ContinueWith(responseTask =>
{
tracingService.Trace("responseTask {0}", responseTask.Result);
});
task.Wait();
}
catch (Exception ex)
{
tracingService.Trace("PROSPluginNotifyPAO Error: {0}", ex.ToString());
throw;
}
}
UPDATE 1
This is for CRM Online 2015. And below is the stack trace
requestUrl http://prospaodev.azure-api.net/hpho/prescriptive-actions/678391
responseTask StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Date: Tue, 06 Oct 2015 23:04:11 GMT
Content-Length: 0
}
Related
I am calling an url using ajax - but when it is called I am getting response HTTP/1.1 403
below is my calling code
function callApi() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("txtHint1").innerHTML = this.responseText;
}
}
xmlhttp.open("GET", "http://103.240.91.110/GENCLASS/checkApi.do?
$95599&99&3456790&09012020152103*", true);
xmlhttp.send();
}
Below is the server side method who is sending the response
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward(); // return value
ApiForm apiForm = (ApiForm)form;
try {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods","GET, OPTIONS, HEAD, PUT, POST");
// send back response
System.out.println("true");
}catch(Exception e){
errors.add(ActionErrors.GLOBAL_ERROR, new org.apache.struts.action.ActionError("load.error.unknown"));
//log.error("Critical Error " + e);
}
if (!errors.isEmpty()) {
saveErrors(request, errors);
forward = mapping.findForward("failure");
} else {
forward = mapping.findForward("success");
}
return (forward);
}
Whenever I am calling the URL I am getting response HTTP/1.1 403
Note that It is working perfectly when I am requesting through browser
I am using tomcat 8.5 on windows on server (called resource)
Any assistance will be appreciated
I'm implementing JWT Auth with Xamarin forms. Now auth looks working from server side and I'm trying to test if it is working as expected on client side. My server app is running on local machine but emulator already configured to send traffic to my domain.
Here is my Xamarin.Forms Test method sending Request for testing:
async Task Test()
{
try
{
var token = await SecureStorage.GetAsync("access_token");
string url = "https://example.com:44330/account/testauth";
using (var httppClient = new HttpClient())
{
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri(url),
Headers =
{
{ "Authorization", $"Bearer {token}" }
}
};
var response = await httppClient.SendAsync(request);
string respStr = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
//Do something
}
}
}
catch (Exception ex)
{
//handle exception
}
}
After sending a request I'm getting an error Failed to connect to example.com/52.202.22.6:44330.
What configuration could be missed considering that WebAuthenticator.AuthenticateAsync works fine for the same domain?
I am doing post request to an api !
string url = "http://xxx.xxx.xx.xx/api/QMn/Create";
var client = new HttpClient();
client.BaseAddress = new Uri(url);
// client.Headers.ContentType = new MediaTypeHeaderValue("application/json");
StringContent content = new StringContent(JsonConvert.SerializeObject(DataToSave), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(url, content);
var result = await response.Content.ReadAsStringAsync();
the Api recieving request is this :
public void Create([FromBody] IEnumerable<QMSRejection> DataToSave)
{
try
{
_QMSRejection.Create(DataToSave);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
I am receiving this error I am not able to understand why ?
{StatusCode: 204, ReasonPhrase: 'No Content',
Version: 1.1, Content: System.Net.Http.StreamContent,
Headers: { Cache-Control: no-cache
Date: Fri, 28 Aug 2020 06:18:43 GMT Pragma: no-cache
Server: Microsoft-IIS/10.0 X-Android-Received-Millis: 1598595526870
X-Android-Response-Source: NETWORK 204 X-Android-Selected-Protocol: http/1.1
X-Android-Sent-Millis: 1598595526011
X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Expires: -1 }}
Do I have to pass headers but I only require to pass body !
I solved the issue the error was from API Side and not client side ! There were validations in the API that was causing it to give such errors !
I have a xamarin app that pull data from a webAPI. I check api address so many times and i am sure it is correct. When i debug my code i have 404 not found error from server. However when i copy and paste the URL to browser i have expected result. I couldn't figure out why my app return 404.
My Method:
public async Task<ICustomerType> GetById(int id)
{
string _token;
if (App.Current.Properties.ContainsKey("token"))
{
_token = (string)App.Current.Properties["token"];
}
else
{ _token = null; }
var webApiResponse =
_connector.PostAsync(
"api/Customer/get/id/" + id,
string.Empty, _token).Result;
var response = webApiResponse.Result.ToString();
var jObjectResponse = JObject.Parse(response);
ICustomerType customerTypeObj = null;
return customerTypeObj;
}
My bridge method to HttpClient's PostAsync method:
private async Task<TResponse> PostAsync(string requestPath, string
jsonContent, bool getToken, string token)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(_apiUrl);
client.DefaultRequestHeaders.Accept.Clear();
var contentType = new MediaTypeWithQualityHeaderValue("application/json");
client.DefaultRequestHeaders.Accept.Add(contentType);
if (getToken)
{
token = GetApiTokenAsync().Result;
}
if (!string.IsNullOrEmpty(token))
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
}
var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");
var response = client.PostAsync(requestPath, httpContent).Result;
var jsonData = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<TResponse>(jsonData);
}
Token: Correct
API Url: Correct(I check "/" signs from debug output.They are well placed. My Api like:
https://MyApi.net/api/Personel/get/id/1)
My Error:
response {StatusCode: 404, ReasonPhrase: 'Not Found', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Request-Context:
appId=cid-v1:Some_String Server: Kestrel
Strict-Transport-Security: max-age=Some_Int Set-Cookie:
ARRAffinity=Some_String;Path=/;HttpOnly;Domain=MyDomain Date: Mon,
09 Jul 2018 07:54:19 GMT X-Powered-By: ASP.NET Content-Length: 0
}} System.Net.Http.HttpResponseMessage
your method verb in API is "GET" but you used "POST" in the client So in browser works because browser call "GET", but in the client doesn't work.
instead of :
var webApiResponse =
_connector.PostAsync(
"api/Customer/get/id/" + id,
string.Empty, _token).Result;
use :
var webApiResponse =
_connector.GetAsync(
"api/Customer/get/id/" + id,
string.Empty, _token).Result;
Getting error while posting data to sql using .net Web API in xamarin.forms
StatusCode: 204, ReasonPhrase: 'No Content', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:{Cache-Control: no-cache Pragma: no-cache Server: Microsoft-IIS/8.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS Date: Thu, 17 Mar 2016 08:32:28 GMT Expires: -1 }}
this is my code to post data
T returnResult = default(T);
HttpClient client = null;
try
{
client = new HttpClient();
client.BaseAddress = new Uri(HostName);
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.Timeout = new TimeSpan(0, 0, 15);
HttpResponseMessage result = null;
StringContent data = null;
if (content != null)
// data = new StringContent(JsonConvert.SerializeObject(content), UTF8Encoding.UTF8, "application/json");
data = new StringContent(JsonConvert.SerializeObject(content), Encoding.UTF8, "application/json");
if (method == HttpMethod.Get)
result = await client.GetAsync(endpoint);
if (method == HttpMethod.Put)
result = await client.PutAsync(endpoint, data);
if (method == HttpMethod.Delete)
result = await client.DeleteAsync(endpoint);
if (method == HttpMethod.Post)
result = await client.PostAsync(endpoint, data);
if (result != null)
{
if (result.IsSuccessStatusCode
&& result.StatusCode == System.Net.HttpStatusCode.OK)
{
var json = result.Content.ReadAsStringAsync().Result;
returnResult = JsonConvert.DeserializeObject<T>(json);
}
}
where should be the problem ?. My API is working fine and it is enabled CORS
Here is an example of how I am using PostAsync in my code, I think the error 'No Content' is referring on you are not sending anything to the server maybe? I hope this example helps:
public async Task<bool> PostAppointmet(AppointmentEntity anAppointment)
{
try{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + App.apiToken);
const string resourceUri = ApiBaseAddress + "/citas";
string postBody = JsonConvert.SerializeObject(anAppointment);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.PostAsync (resourceUri, new StringContent (postBody, Encoding.UTF8, "application/json"));
if (response.IsSuccessStatusCode) {
return true;
}
return false;
}
catch{
return false;
}
}
Where AppointmentEntity is my Model:
public class AppointmentEntity
{
public int doctor { get; set; }
public PatientEntity paciente { get; set; }
public DateEntity cita { get; set; }...
}
Try to use like this
var task = client.PostAsync(endpoint,content:data);