tuff
tuff

Reputation: 5163

Web API HttpPost body with spaces and quotes

I want to create an HttpPost controller method which takes a string which may include spaces or single quotes. The code I have now looks like:

[HttpPost]
[Route("ValidateExpression")]
public bool ValidateExpression([FromBody] string testExpression )
{
    // ...
}

and I post to it via JS (Angular) like:

$http.post(myRootUrl +'ValidateExpression', "'token1' || 'token2'");

I can walk through the JS and see that the test expression is what I expect it to be, and it also looks fine in the body of the outgoing post (as seen in Fiddler & Firebug). But when I breakpoint in the first line of ValidateExpression on the server side, testExpression has been truncated to the first space, and stripped of quotes, so what I receive is token1.

How can I avoid this unwanted transformation?

I guess that I could create a model to wrap a single string, and send my string as field value in a JSON object matching the model...or I could do some escaping on the string, but the first seems ugly/unnecessary and the second seems like I'd be trying to hack around behaviour I don't really understand.

Upvotes: 2

Views: 1324

Answers (1)

timeiscoffee
timeiscoffee

Reputation: 458

You need to pass in JSON object with key equal to that of parameter name.

// POST api/values
public string Post(string value) {
  return value;
}

$.post('/api/values', { value: 'Dave' });

Alternatively, you can satisfy Web API's encoding requirement these ways:

$.post('api/values', "=" + value);

or

$.post('api/values', { '': value });

More information here: http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

Edit:

Also, note that angualrjs http.post and jquery.post behaves differently:

The difference is in how jQuery and AngularJS serialize and transmit the data. Fundamentally, the problem lies with your server language of choice being unable to understand AngularJS’s transmission natively—that’s a darn shame because AngularJS is certainly not doing anything wrong. By default, jQuery transmits data using Content-Type: x-www-form-urlencoded and the familiar foo=bar&baz=moe serialization. AngularJS, however, transmits data using Content-Type: application/json and { "foo": "bar", "baz": "moe" } JSON serialization, which unfortunately some Web server languages—notably PHP—do not unserialize natively.

http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

Upvotes: 1

Related Questions