JSon to WebAPI becomes [[]],[[]],[[]],[[]] - asp.net-web-api

something strange is happening with my WebAPI that I can't seem to figure out yet.
I'm using SoapUI to post this payload:
{
'Id': '00000000-0000-0000-1821-000000000000',
'Operation': 'post',
'Severity': 1,
'LoginName': 'nickj#noemail.email',
'EventText': 'testing post method'
}
My WebAPI is just this:
public HttpResponseMessage PostTrackingInformation(HttpRequestMessage req)
{
var content = req.Content;
string jsonContent = content.ReadAsStringAsync().Result;
}
However, when I look at the string content, I end up with content that looks like this:
[[[]],[[]],[[]],[[]],[[]]]
I am sending in application/json as the Content-Type
Has anybody seen this before? What am I missing?
Thanks,
Nick

This turns out to not be an issue with the API itself, but with Restsharp 106.69's version and Newtonsoft.
I ended up adding this package:
using RestSharp.Serializers.Newtonsoft.Json;
and then my Restsharp Request lines like this:
var request = new RestSharp.RestRequest {Method =
Method.POST, RequestFormat = DataFormat.Json, JsonSerializer = new
NewtonsoftJsonSerializer()};
It also sounds like the next major version of RestSharp (107) will support Newtonsoft Again.

Related

Malformed request from aiohttp.ClientSession().post() with multiple image files

I'm still relatively new to Python and my first time to use aiohttp so I'm hoping someone can help spot where my problem is.
I have a function that does the following:
retrieves from the JSON payload two base64 strings - base64Front and base64Back
decode them, save to "images" folder
send the Front.jpg and Back.jpg to an external API
this external API expects a multipart/form-data
imgDataF = base64.b64decode(base64FrontStr)
frontFilename = 'images/Front.jpg'
with open(frontFilename, 'wb') as frontImgFile:
frontImgFile.write(imgDataF)
imgDataB = base64.b64decode(base64BackStr)
backFilename = 'images/Back.jpg'
with open(backFilename, 'wb') as backImgFile:
backImgFile.write(imgDataB)
headers = {
'Content-Type': 'multipart/form-data',
'AccountAccessKey': 'some-access-key',
'SecretToken': 'some-secret-token'
}
url = 'https://external-api/2.0/AuthenticateDoc'
files = [('file', open('./images/Front.jpg', 'rb')),
('file', open('./images/Back.jpg', 'rb'))]
async with aiohttp.ClientSession() as session:
async with session.post(url, data=files, headers=headers) as resp:
print(resp.status)
print(await resp .json())
The response I'm getting is status code 400 with:
{'ErrorCode': 1040, 'ErrorMessage': 'Malformed/Invalid Request detected'}
If I call the url via Postman and send the two jpg files, I get status code 200.
Hope someone can help here.
Thanks in advance.
Try using FormData to construct your request. Remove the content type from header and use it in FormData field as below:
data = FormData()
data.add_field('file',
open('Front.jpg', 'rb'),
filename='Front.jpg',
content_type='multipart/form-data')
await session.post(url, data=data)
Reference: https://docs.aiohttp.org/en/stable/client_quickstart.html#post-a-multipart-encoded-file

Ajax POST to WCF Rest CORS-compliant WebService throws error 405

I'm doing some test over WCF REST WebServices and i'm stuck with the POST call.
I've created a webservice that exposes some test data about the good ol' Northwind DB and since i wish to consume it locally from a test HTML page and since i'd like to test CORS capabilities, i made it CORS compliant by following these instruction http://enable-cors.org/server_wcf.html.
Unfortunately problems comes out when i make POST calls.
Unlike GET calls (works very well), POST call throws this error:
What the hell is it? it seems that "Access-Control-Allow-Origin" header is not correctly managed client-side, beacuse in my EnableCrossOriginResourceSharingBehavior WCF class, the method "ApplyDispatchBehavior" (it filter "Access-Control-Allow-Origin" headers of the arrival requests) is hit when i make a POST call, but then Ajax call fails.
This is my jQuery Ajax post command:
//Create new object
var item = {
"CustomerId": "0",
"CompanyName": "prova"
};
//Push object
$.ajax({
type: "POST",
url: 'http://localhost:3434/NorthwindService.svc/Customer/Create',
crossDomain: true,
headers: {'Access-Control-Allow-Origin' : '*'},
data: JSON.stringify(item),
success: function (data) {
alert('ok!');
},
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
This is my WCF service Visual Studio 2013 project.
To test it, you only have to set "NorthwindConnectionString" in web.config to an existing one. The webservice method that i've problem with, is the POST to the "http://localhost:3434/NorthwindService.svc/Customer/Create" method, all the others works fine.
This is a preview of my method contract:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "Customer/Create", BodyStyle=WebMessageBodyStyle.WrappedRequest)]
void NewCustomer(CustomerDTO customer);
Thanks in advance.
I don't know what's going on, but thanks to supertopi and his link, i did the right steps to make it works. Unfortunately implementing all things discussed in here How to handle Ajax JQUERY POST request with WCF self-host did't works. I continued to get "405 Method not allowed" even by creating a new project.
The only thing that works in my case is the following:
1) Implement CustomHeaderMessageInspector and EnableCrossOriginResourceSharingBehavior classes and edit web.config as exposed in http://enable-cors.org/server_wcf.html.
2) Create in the service contract the following method:
[OperationContract]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
void GetOptions();
3) Implementing it empty.
public void GetOptions()
{
}
It sounds crazy, but it actually works.
If i remove GetOptions() operation contract, i continue to get 405 error on my client. If i implement it like indicated by supertopi's link (obviously after remove all stuff created in the step 1), it doesn't work either.
Hope it helps.
Your HTTP Request Method is defined OPTIONS instead of POST.
That is why you get HTTP Response 405 Method not Allowed (no handler for OPTIONS request)
Change the type parameter in jQuery ajax constructor to "POST" and the request is routed to correct handler.

How can I test my asp.net web API method?

I have a web api method:
[HttpPost, ActionName("GET")]
public string Get(string apiKey, DateTime start, DateTime end)
{
var user = db.Users.SingleOrDefault(u => u.Id == apiKey);
if (user == null)
{
return string.Empty;
}
var records = db.Histories.Where(h => h.Date >= start && h.Date <= end);
return JsonConvert.SerializeObject(records);
}
And here is the url I tried to call the method, but it doesn't reach to the method.
http://localhost:11847/api/History/Get?apiKey=398cfa9b-8c5c-4cf4-b4f3-8904a827ff22&start=2014-01-01&end=2014-12-01
I also have changed the WebApiConfig.cs
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { id = RouteParameter.Optional }
);
from "api/{controller}/{id} to "api/{controller}/{action}
UPDATE 2022:
It's 2022 now. A lot has changed. There are plenty of clients out there. I will list my favourites.
Postman - Postman has improved since I answered this in 2014. Apart from being a client, it has other features like collaboration, scripting, importing endpoints from various sources like Open API etc. Pretty simple to use.
Thunder Client - A Visual Studio extension that has a similar feel as Postman but a pure API client.
For testing the api, you can use fiddler(http://www.telerik.com/fiddler) or a chrome app called postman.
You should also try the POSTMAN by http://www.getpostman.com/ which can be added to chrome as an app. It really good and lets you organize your apis.
I found out how to write the url in Fiddler:
In the Composer panel:
Parsed:
GET : http://localhost:11847/api/History/GetRecords?apiKey=398cfa9b-8c5c-4cf4-b4f3-8904a827ff22&start=2014-01-01&end=2014-12-01
Request Headers:
User-Agent: Fiddler
Content-Type: application/json
Host: localhost:11847
Content-Length: 0

Facebook graph api: upload multipart/form-data encoded image

I am trying to post an image using the source parameter (Multipart/form-data) in the Graph API explorer. My source parameter looks like this:
{Content-Type: multipart/form-data; boundary=xxxsrixxx
--xxxsrixxx
Content-Disposition: attachment; filename=try2.gif
Content-Type: image/gif
Content-Transfer-Encoding: binary,base64
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
--xxxsrixxx--}
This always seems to return
{
"error": {
"message": "(#324) Requires upload file",
"type": "OAuthException",
"code": 324
}
}
Few questions:
Does facebook source parameter accept base64 encoded image data?
Has anyone tried using the source parameter in the graph api explorer and have a working sample?
should the source param value should be url-encoded?
Note: My access token has all the required permissions and if i am not wrong, my encoding seems to be wrong. The base64 encoded text above is a complete image and i could decode it and get the image.
Ok. This is going to sound crazy. After a week of trying I was able to post an image successfully to the facebook wall. The fix was to send the raw binary data as it is (no base64 encoding - fb does not like it) and make sure your multipart/form-data is correct. For instance, if you boundary is defined as "boundary=--xxxsrixxx" your actual request should look like this "----xxxsrixxx\r\nContent-Disposition......\r\n----xxxsrixxx"
This works fine for me, it only uses native JavaScript features and a file input:
const fileReader = new FileReader();
const file = document.getElementById('imageInput').files[0];
fileReader.onloadend = async () => {
const photoData = new Blob([fileReader.result], {type: 'image/jpg'});
const formData = new FormData();
formData.append('access_token', pageAccessToken);
formData.append('source', photoData);
formData.append('message', 'some status message');
let response = await fetch(`https://graph.facebook.com/${pageId}/photos`, {
body: formData,
method: 'post'
});
response = await response.json();
console.log(response);
};
fileReader.readAsArrayBuffer(file);
More information: http://www.devils-heaven.com/facebook-javascript-sdk-photo-upload-with-formdata/

Making jQuery $.ajax call to Twitter API 1.1 search

Here is a very simple example of a call to Twitter's search API to get all tweets from a tag known to have tweets, #fml.
I believe I am correctly using the application-only authentication as explained here: https://dev.twitter.com/docs/auth/application-only-auth (see Step 3 for example of a call)
I am being asked for a solution that does not involve any server-side code so I am including the bearer code in the javascript, which isn't good to begin with, but....
I would expect this code to work. Instead it produces the error '400 (Bad Request)'. Any ideas?
$.ajax({
url: "https://api.twitter.com/1.1/search/tweets.json",
dataType: "jsonp",
data: "q=%23fml",
beforeSend: function (xhr) {
xhr.setRequestHeader ("Authorization", "Bearer XXmyBearerCodeXX");
},
success: function(json){ alert(json); }
});
EDIT 1 - Validated Twitter call
Using hurl.eu I was able to get a successful response from the API with the above query and Authorization header, so I assume this means my Twitter call is correct, just not set up correctly within jQuery.ajax(), but I just don't see what is missing.
You cannot set request headers using AJAX calls with dataType JSONP.
See this question: Set Headers with jQuery.ajax and JSONP?
The best solution is to use a server-side proxy to do the search for you. I know you are looking for a client only solution, but with this restriction, and with no way around CORS, this is how it seems to be done today for the Twitter API.
Edit It may be possible using a proxy like Yahoo's YQL if you don't have access to one.
on your severside create a jsp or servlet and from the client side make a JSON call to the .jsp/servlet and that will return back the json object to the javascript. In serverside use the twitter4j api.
sample code:
`
$.getJSON(http://localhost:8080/test.jsp?callback=?",
{
jspqueryStr : queryStr,
jspgeocodeStr : geocodeStr,
lat:latStr,
lan:lngStr,
radius:radiusStr,
}, displayResult);
//This function returns the data as json object from server.
function displayResult(data) {}
In the jsp the code is like below
<%
String jspqueryStr = request.getParameter("jspqueryStr");
String jspgeocodeStr = request.getParameter("jspgeocodeStr");
String diseasename = request.getParameter("jspqueryStr");
String lat = request.getParameter("lat");
String lan = request.getParameter("lan");
String radius = request.getParameter("radius");
Gson gson = new Gson();
String json = gson.toJson(tweetList);
json = request.getParameter("callback") + "(" + json + ");";
out.println(json);
public List<Status> searchstream(){
//here all the twitter4j api code to get the data
retrun tweetList;
}
%>
`

Resources