How to create http MessageBody body with fields that contain dashes

4 vues (au cours des 30 derniers jours)
stedst9
stedst9 le 20 Juil 2024
Commenté : Umar le 23 Juil 2024
I would like to create http message bodies with fields that contain dashes. I haven't been able to find a workaround for Matlab disallowing hyphens (dashes) in the var names.
Here is what I'm trying to do - for illustration - I have an underscore in place of a hyphen the "test_var" (below)
Even after generating the RequestMessage (req1 below), you cannot change "test_var" to "test-var" because the RequestMessage is still storing the request as a struct (not as a string which could be modified).
method = matlab.net.http.RequestMethod.POST;
header = matlab.net.http.HeaderField('Content-Type', 'application/json');
header = addFields(header,'User-Agent', 'my-client/99.9');
header = addFields(header,'Accept', 'application/json');
% Struct approach
struct1 = struct('login', 'me', 'password', 'pw123', 'test_var', true)
body1 = matlab.net.http.MessageBody(struct1)
req1 = matlab.net.http.RequestMessage(method,header,body1)
show(req1)
POST
Content-Type: application/json
User-Agent: my-client/99.9
Accept: application/json
{"login":"me","password":"pw123","test_var":true}
req1.Body.Data
ans =
struct with fields:
login: 'me'
password: 'pw123'
test_var: 1
  12 commentaires
stedst9
stedst9 le 23 Juil 2024
Thanks to everyone who chipped in with their thoughts. The solution from Mathworks is solid.
Umar
Umar le 23 Juil 2024
No problem, @stedst9, it’s all teamwork and resolving problems together to help out each other. Glad to know that this problem is resolved.

Connectez-vous pour commenter.

Réponse acceptée

stedst9
stedst9 le 22 Juil 2024
Modifié(e) : stedst9 le 23 Juil 2024
I contacted Mathworks support and received the following solution - it works:
% Method
method = matlab.net.http.RequestMethod.POST;
% Header
header = matlab.net.http.HeaderField('Content-Type', 'application/json');
header = addFields(header,'User-Agent', 'my-client/99.9');
header = addFields(header,'Accept', 'application/json');
% Body
keySet = {'login', 'password', 'test-var'};
valueSet = {'me', 'pw123', true};
map = containers.Map(keySet, valueSet);
body = matlab.net.http.MessageBody(map);
request = matlab.net.http.RequestMessage(method,header,body);
response = send(request, uri);

Plus de réponses (1)

Samuel Chan
Samuel Chan le 22 Juil 2024
If Content-Type can be "text/plain" (mislabelling the content-type -- not sure if your API accepts that), then you can use string or char array as the message body:
MessageBody('{"login":"me","password":"pw123","test-var":true}');
If Content-Type must be "application/json", then calling RequestMessage.send will use jsonencode on your message body to generate the payload to send. If your message body contains a struct, you get:
'{"login":"me","password":"pw123","test_var":true}'
else if your message body contains a string, you get:
"{\"login\":\"me\",\"password\":\"pw123\",\"test-var\":true}"
Neither result is the JSON with dashed fields you desired.
If you want both Content-Type "application/json" and dashed field, you may look into this:
"To send arbitrary headers and data in a request message, set Completed to true to prevent the send method from modifying the message."
But in that case, it seems you will have to build and validate the request message yourself. (I have not try this before.)
  1 commentaire
stedst9
stedst9 le 22 Juil 2024
Samuel,
I'm not permitted to mislabel the content-type. You're right about the struct and string output - you got the same result as me. For the past few hours, I've made several of RequestMessage attempts using request.Completed = true. Still no luck - I'm not through the woods yet.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Call Web Services from MATLAB Using HTTP dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by