필터 지우기
필터 지우기

How to create http MessageBody body with fields that contain dashes

조회 수: 50 (최근 30일)
stedst9
stedst9 2024년 7월 20일 14:51
댓글: stedst9 대략 4시간 전
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
  댓글 수: 10
dpb
dpb 2024년 7월 21일 19:47
Will Python support? Maybe there's a way there that could be called from MATLAB. Or, use the .NET stuff directly, maybe? I dunno, I'm just fishing here.
As noted, I'd either send a support request or call directly on this one.
stedst9
stedst9 대략 23시간 전
편집: stedst9 대략 19시간 전
Yes @dpb - I've had the same thought: Python would be a last resort work-around. It seems like such a hack though.
In theory, the Mathworks deverlopers put enough capability into the MessageBody class that there should be at least one way to do it in Matlab. I'm hoping to get a good, clean Matlab solution and maybe some improvements to the online Matlab documentation that show how to use more of the options in the MessageBody class.

댓글을 달려면 로그인하십시오.

답변 (1개)

Samuel Chan
Samuel Chan 대략 11시간 전
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
stedst9
stedst9 대략 4시간 전
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.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Call Web Services from MATLAB Using HTTP에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by