Skip to content

Commit 0b824f5

Browse files
committed
added curl syntax generation
1 parent bccf6a9 commit 0b824f5

File tree

1 file changed

+39
-13
lines changed

1 file changed

+39
-13
lines changed

src/components/api-request.js

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export default class ApiRequest extends LitElement {
119119
this.responseHeaders = '';
120120
this.responseText = '';
121121
this.responseUrl = '';
122+
this.curlSyntax = '';
122123

123124
}
124125

@@ -198,8 +199,8 @@ export default class ApiRequest extends LitElement {
198199
if (mimeReq.includes('json')){shortMimeTypes[mimeReq]='json';}
199200
else if (mimeReq.includes('xml')){shortMimeTypes[mimeReq]='xml';}
200201
else if (mimeReq.includes('text/plain')){shortMimeTypes[mimeReq]='text';}
201-
else if (mimeReq.includes('form-urlencoded')){shortMimeTypes[mimeReq]='form';}
202-
else if (mimeReq.includes('multipart-form')){shortMimeTypes[mimeReq]='multipart-form';}
202+
else if (mimeReq.includes('form-urlencoded')){shortMimeTypes[mimeReq]='form-urlencoded';}
203+
else if (mimeReq.includes('multipart/form-data')){shortMimeTypes[mimeReq]='multipart-form-data';}
203204

204205
let mimeReqObj = content[mimeReq];
205206
let reqExample="";
@@ -320,12 +321,16 @@ export default class ApiRequest extends LitElement {
320321
<div id="tab_buttons" class="tab-buttons row" @click="${this.activateTab}">
321322
<button class="tab-btn active" content_id="tab_response_text"> RESPONSE TEXT</button>
322323
<button class="tab-btn" content_id="tab_response_headers"> RESPONSE HEADERS</button>
324+
<button class="tab-btn" content_id="tab_curl">CURL</button>
323325
</div>
324326
<div id="tab_response_text" class="tab-content col" style="flex:1; ">
325-
<textarea class="mono" style="min-height:180px; padding:16px; white-space:nowrap;"> ${this.responseText} </textarea>
327+
<textarea class="mono" style="min-height:180px; padding:16px; white-space:nowrap;">${this.responseText}</textarea>
326328
</div>
327329
<div id="tab_response_headers" class="tab-content col" style="flex:1;display:none">
328-
<textarea class="mono" style="min-height:180px; padding:16px; white-space:nowrap;"> ${this.responseHeaders} </textarea>
330+
<textarea class="mono" style="min-height:180px; padding:16px; white-space:nowrap;">${this.responseHeaders}</textarea>
331+
</div>
332+
<div id="tab_curl" class="tab-content col" style="flex:1;display:none">
333+
<code style="min-height:180px; padding:16px;font-size:12px; border:1px solid var(--input-border-color);overflow: scroll;word-break: break-word;">${this.curlSyntax}</code>
329334
</div>
330335
</div>`}
331336
`
@@ -361,6 +366,7 @@ export default class ApiRequest extends LitElement {
361366

362367
onTryClick(e){
363368
let me = this;
369+
let curl="", curlHeaders="", curlData="", curlForm="";
364370
let requestPanelEl = e.target.closest(".request-panel");
365371
let pathParamEls = [...requestPanelEl.querySelectorAll(".request-param[data-ptype='path']")];
366372
let queryParamEls = [...requestPanelEl.querySelectorAll(".request-param[data-ptype='query']")];
@@ -374,7 +380,7 @@ export default class ApiRequest extends LitElement {
374380
'method' : this.method.toUpperCase(),
375381
'headers':{},
376382
}
377-
383+
378384
//Path Params
379385
pathParamEls.map(function(el){
380386
fetchUrl = fetchUrl.replace("{"+el.dataset.pname+"}", el.value);
@@ -393,66 +399,86 @@ export default class ApiRequest extends LitElement {
393399
if (this.apiKeyValue && this.apiKeyName && this.apiKeyLocation==='query'){
394400
fetchUrl = `${fetchUrl}&${this.apiKeyName}=${this.apiKeyValue}`;
395401
}
402+
403+
//Final URL
396404
fetchUrl = `${this.server.replace(/\/$/, "")}${fetchUrl}`;
405+
curl=`curl -X ${this.method.toUpperCase()} "${fetchUrl}" `;
397406

398407
//Header Params
399408
headerParamEls.map(function(el){
400409
if (el.value){
401410
fetchOptions.headers[el.dataset.pname] = el.value;
411+
curlHeaders = curlHeaders + ` -H "${fetchOptions.headers[el.dataset.pname]}: ${el.value}"`;
402412
}
403413
});
404414
// Add Authentication Header if provided
405415
if (this.apiKeyValue && this.apiKeyName && this.apiKeyLocation==='header'){
406416
fetchOptions.headers[this.apiKeyName] = this.apiKeyValue;
417+
curlHeaders = curlHeaders + ` -H "${this.apiKeyName}: ${this.apiKeyValue}"`;
407418
}
408419

409420
//Form Params
410421
if (formParamEls.length>=1){
411422
let formEl = requestPanelEl.querySelector("form");
412-
fetchOptions.body = new FormData(formEl);
413423
if (formEl.classList.contains("form-urlencoded")){
424+
let formUrlParams = new URLSearchParams();
414425
fetchOptions.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'
426+
curlHeaders = curlHeaders + ` -H "Content-Type: application/x-www-form-urlencoded"`;
427+
formParamEls.map(function(el){
428+
if (el.value){
429+
formUrlParams.append(el.dataset.pname,el.value);
430+
curlForm = curlForm + ` -F "${el.dataset.pname}=${el.value}"`;
431+
}
432+
});
433+
fetchOptions.body = formUrlParams;
415434
}
416435
else{
417-
fetchOptions.headers['Content-Type'] = 'multipart/form-data; charset=utf-8'
436+
//fetchOptions.headers['Content-Type'] = 'multipart/form-data; charset=utf-8'
437+
fetchOptions.body = new FormData(formEl);
418438
}
419439
}
420440

421441
//Body Params (json/xml/text)
422442
if (bodyParamEls.length>=1){
423443
if (bodyParamEls.length===1){
424444
fetchOptions.headers['Content-Type'] = bodyParamEls[0].dataset.ptype;
445+
curlHeaders = curlHeaders + ` -H "Content-Type: ${bodyParamEls[0].dataset.ptype}"`;
425446
fetchOptions.body=bodyParamEls[0].value;
447+
curlData = ` -d ${JSON.stringify(bodyParamEls[0].value.replace(/(\r\n|\n|\r)/gm,"") )}`;
426448
}
427449
else{
428450
let mimeTypeRadioEl = e.target.closest(".request-panel").querySelector("input[name='request_body_type']:checked");
429451
let selectedBody = mimeTypeRadioEl===null?'json':mimeTypeRadioEl.value;
430452
let bodyData='';
431453
if (selectedBody === 'json'){
432454
bodyData = requestPanelEl.querySelector(".request-body-param.json").value;
433-
fetchOptions.headers['Content-Type'] = 'application/json; charset=utf-8'
434-
fetchOptions.body=bodyData;
455+
fetchOptions.headers['Content-Type'] = 'application/json; charset=utf-8';
456+
curlHeaders = curlHeaders + ` -H "Content-Type: application/json"`;
435457
}
436458
else if (selectedBody === 'xml'){
437459
bodyData = requestPanelEl.querySelector(".request-body-param.xml").value;
438-
fetchOptions.headers['Content-Type'] = 'application/xml; charset=utf-8'
439-
fetchOptions.body=bodyData;
460+
fetchOptions.headers['Content-Type'] = 'application/xml; charset=utf-8';
461+
curlHeaders = curlHeaders + ` -H "Content-Type: application/xml"`;
440462
}
441463
else if (selectedBody === 'text'){
442464
bodyData = requestPanelEl.querySelector(".request-body-param.text").value;
443-
fetchOptions.headers['Content-Type'] = 'text/plain; charset=utf-8'
444-
fetchOptions.body=bodyData;
465+
fetchOptions.headers['Content-Type'] = 'text/plain; charset=utf-8';
466+
curlHeaders = curlHeaders + ` -H "Content-Type: text/plain"`;
445467
}
468+
fetchOptions.body=bodyData;
469+
curlData = ` -d ${JSON.stringify(bodyData.replace(/(\r\n|\n|\r)/gm,""))}`;
446470
}
447471
}
448472

449473
me.responseUrl = '';
450474
me.responseHeaders = '';
451475
me.responseText = '';
476+
me.curlSyntax = '';
452477
me.responseStatus = 'success';
453478
me.responseMessage = ''
454479

455480
fetch(fetchUrl,fetchOptions).then(function(resp){
481+
me.curlSyntax = `${curl} ${curlHeaders} ${curlData} ${curlForm}`;
456482
me.responseStatus = resp.ok ? 'success':'error';
457483
me.responseMessage = `${resp.statusText}:${resp.status}`;
458484
me.responseUrl = resp.url;

0 commit comments

Comments
 (0)