Praktische Online-Tools für Entwickler: JSON & XML formatiert anzeigen, REST-APIs testen, Daten prüfen und alles direkt im Browser nutzen – ohne Speicherung.
REST API Tester
Kostenloser REST-Tester: HTTP-Requests mit Headern, Auth & Body senden. Response als JSON/XML/HTML/Plain ansehen, cURL generieren, History. 100 % lokal.
Datenschutz: Alles bleibt im Browser. Es wird nichts gespeichert/übertragen – außer deinem Request zur Ziel-API (oder optional über deinen eigenen Proxy).
(function(){
function qs(sel,root){return(root||document).querySelector(sel)}
var root=document.getElementById('sd-restman');if(!root)return;
var els={
method:qs('#sdr-method',root),url:qs('#sdr-url',root),send:qs('#sdr-send',root),
headers:qs('#sdr-headers',root),addHeader:qs('#sdr-add-header',root),
auth:qs('#sdr-auth',root),authV1:qs('#sdr-auth-v1',root),authV2:qs('#sdr-auth-v2',root),
bodyType:qs('#sdr-body-type',root),ctJson:qs('#sdr-ct-json',root),body:qs('#sdr-body',root),
status:qs('#sdr-status',root),time:qs('#sdr-time',root),size:qs('#sdr-size',root),ctype:qs('#sdr-ctype',root),
tabs:root.querySelectorAll('.sd-r__tab'),
outJSON:qs('#sdr-out-json',root),outXML:qs('#sdr-out-xml',root),outHTML:qs('#sdr-out-html',root),
outPlain:qs('#sdr-out-plain',root),outCurl:qs('#sdr-out-curl',root),
respHeaders:qs('#sdr-resp-headers',root),
copy:qs('#sdr-copy',root),download:qs('#sdr-download',root),
useProxy:qs('#sdr-use-proxy',root),proxyUrl:qs('#sdr-proxy-url',root),
clearHistory:qs('#sdr-clear-history',root),history:qs('#sdr-history',root)
};
function addHeaderRow(name,value){
var wrap=document.createElement('div');wrap.className='sd-r__headers-row';wrap.style.display='contents';
var key=document.createElement('input');key.className='sd-r__hkey';key.placeholder='Header-Name';key.value=name||'';
var val=document.createElement('input');val.className='sd-r__hval';val.placeholder='Header-Wert';val.value=value||'';
var del=document.createElement('button');del.className='sd-r__hdel';del.type='button';del.textContent='Entfernen';
del.addEventListener('click',function(){wrap.remove()});
wrap.appendChild(key);wrap.appendChild(val);wrap.appendChild(del);
els.headers.appendChild(wrap);
}
addHeaderRow('Accept','*/*');
els.addHeader.addEventListener('click',function(){addHeaderRow()});
els.auth.addEventListener('change',function(){
var m=els.auth.value;
els.authV2.style.display=(m==='basic')?'':'none';
els.authV1.placeholder=(m==='bearer'?'Bearer Token':(m==='basic'?'Benutzer':'Token / Benutzer'));
});
els.tabs.forEach(function(btn){
btn.addEventListener('click',function(){
els.tabs.forEach(function(b){b.classList.remove('sd-is-active')});
btn.classList.add('sd-is-active');
var t=btn.dataset.tab;
[els.outJSON,els.outXML,els.outHTML,els.outPlain,els.outCurl].forEach(function(v){v.classList.remove('sd-is-active')});
({json:els.outJSON,xml:els.outXML,html:els.outHTML,plain:els.outPlain,curl:els.outCurl}[t]).classList.add('sd-is-active');
});
});
function buildHeaders(){
var h={};
root.querySelectorAll('.sd-r__hkey').forEach(function(k,i){
var key=k.value.trim();var val=root.querySelectorAll('.sd-r__hval')[i].value;
if(key)h[key]=val;
});
if(els.auth.value==='bearer'&&els.authV1.value)h['Authorization']='Bearer '+els.authV1.value.trim();
if(els.auth.value==='basic'&&els.authV1.value){
var u=els.authV1.value||'',p=els.authV2.value||'';
h['Authorization']='Basic '+btoa(u+':'+p);
}
if(els.ctJson.checked)h['Content-Type']='application/json';
return h;
}
function prettyJSON(s){try{return JSON.stringify(JSON.parse(s),null,2)}catch(_){return s}}
function prettyXML(s){
try{
var p=new DOMParser(),d=p.parseFromString(s,'application/xml');
if(d.getElementsByTagName('parsererror').length)return s;
var xml=new XMLSerializer().serializeToString(d),out='',pad=0;
xml.split(/>\s*</).forEach(function(n){
if(n.match(/^\/\w/))pad--;
out+=' '.repeat(Math.max(pad,0))+'\n';
if(n.match(/^]*[^\/]$/))pad++;
});
return out.trim();
}catch(_){return s}
}
function hlJSON(s){
var esc=s.replace(/&/g,'&').replace(/</g,'<');
return esc
.replace(/("(\\.|[^"\\])*")(\s*:)?/g,function(m,str,_e,colon){
return colon
?''+str+':'
:''+str+'';
})
.replace(/\b(true|false)\b/g,'$1')
.replace(/\b(null)\b/g,'$1')
.replace(/-?\b\d+(\.\d+)?([eE][+-]?\d+)?\b/g,'$&');
}
function hlXML(s){
var esc=s.replace(/&/g,'&').replace(//g,'>');
esc=esc.replace(/<!--([\s\S]*?)-->/g,'<!--$1-->');
esc=esc.replace(/<(\/?)([a-zA-Z_:][\w:.-]*)([^&]*?)(\s*\/?)>/g,function(m,slash,tag,rest,close){
var attrs=rest.replace(/([a-zA-Z_:][\w:.-]*)(\s*=\s*)(".*?"|'.*?')/g,
' $1$2$3');
return'<'+slash+''+tag+''+attrs+close+'>';
});
return esc;
}
function makeCurl(url,method,headers,body){
var lines=['curl -i','-X '+method,"'"+url.replace(/'/g,"'\\''")+"'"];
Object.keys(headers).forEach(function(k){
lines.splice(1,0,"-H '"+k+": "+String(headers[k]).replace(/'/g,"'\\''")+"'");
});
if(body!=null&&body!==''){
lines.splice(1,0,"--data '"+String(body).replace(/'/g,"'\\''")+"'");
}
return lines.join(' \\\n ');
}
var HKEY='sd-restman-history';
function loadHistory(){
var arr=JSON.parse(localStorage.getItem(HKEY)||'[]');
els.history.innerHTML='';
arr.forEach(function(it,idx){
var card=document.createElement('div');card.className='sd-r__hist';
var h4=document.createElement('h4');h4.textContent=it.method+' '+it.url;
var sm=document.createElement('small');
sm.textContent=Object.keys(it.headers||{}).length+' Header \u00b7 '+(it.body?(it.body.length+' B Body'):'kein Body');
card.appendChild(h4);card.appendChild(sm);card.appendChild(document.createElement('br'));
var btnL=document.createElement('button');btnL.className='sd-r__btn';btnL.textContent='Laden';
var btnD=document.createElement('button');btnD.className='sd-r__btn';btnD.textContent='L\u00f6schen';
btnL.addEventListener('click',function(){applyRequest(it)});
btnD.addEventListener('click',function(){arr.splice(idx,1);localStorage.setItem(HKEY,JSON.stringify(arr));loadHistory()});
card.appendChild(btnL);card.appendChild(btnD);
els.history.appendChild(card);
});
}
function saveHistory(item){
var arr=JSON.parse(localStorage.getItem(HKEY)||'[]');
arr.unshift(item);
var seen={},filtered=[];
arr.forEach(function(x){
var key=x.method+' '+x.url;
if(seen[key])return;seen[key]=true;filtered.push(x);
});
localStorage.setItem(HKEY,JSON.stringify(filtered.slice(0,20)));
loadHistory();
}
function applyRequest(it){
els.method.value=it.method;els.url.value=it.url;
els.ctJson.checked=!!it.ctJson;
els.body.value=it.body||'';
els.headers.innerHTML='';
var entries=it.headers||{};
Object.keys(entries).forEach(function(k){addHeaderRow(k,entries[k])});
}
els.clearHistory.addEventListener('click',function(){localStorage.removeItem(HKEY);loadHistory()});
loadHistory();
function switchTab(id){
root.querySelectorAll('.sd-r__tab').forEach(function(b){b.classList.remove('sd-is-active')});
root.querySelector('.sd-r__tab[data-tab="'+id+'"]').classList.add('sd-is-active');
[els.outJSON,els.outXML,els.outHTML,els.outPlain,els.outCurl].forEach(function(v){v.classList.remove('sd-is-active')});
({json:els.outJSON,xml:els.outXML,html:els.outHTML,plain:els.outPlain,curl:els.outCurl}[id]).classList.add('sd-is-active');
}
function send(){
[els.outJSON,els.outXML,els.outHTML,els.outPlain,els.outCurl,els.respHeaders].forEach(function(e){e.textContent=''});
els.status.textContent='\u2013';els.time.textContent='\u2013';els.size.textContent='\u2013';els.ctype.textContent='\u2013';
var url=els.url.value.trim();if(!url){els.status.textContent='URL fehlt';return}
var method=els.method.value;
var headers=buildHeaders();
var body;if(method!=='GET'&&method!=='HEAD'){body=els.body.value}
var useProxy=els.useProxy.checked;
var proxyUrl=(els.proxyUrl.value||'').trim()||'/api/cors-proxy.php';
var init={method:method,headers:headers};
if(body!==undefined&&body!=='')init.body=body;
var t0=performance.now();
var fetchPromise;
if(useProxy){
var payload={url:url,method:method,headers:headers,body:body};
fetchPromise=fetch(proxyUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)});
}else{
fetchPromise=fetch(url,init);
}
fetchPromise.then(function(res){
var t1=performance.now();
els.time.textContent=(t1-t0).toFixed(0)+' ms';
els.status.textContent=res.status+' '+(res.statusText||'');
var ct=res.headers.get('content-type')||'';
els.ctype.textContent=ct||'\u2013';
var size=res.headers.get('content-length');
var hdr='';res.headers.forEach(function(v,k){hdr+=k+': '+v+'\n'});
els.respHeaders.textContent=hdr.trim();
return res.text().then(function(text){
if(!size)size=(new Blob([text])).size.toString();
els.size.textContent=size+' B';
var asJSON=/application\/json|\/json|text\/json/i.test(ct);
var asXML=/application\/xml|text\/xml|\/xml/i.test(ct);
var asHTML=/text\/html/i.test(ct);
if(asJSON){var p=prettyJSON(text);els.outJSON.innerHTML=hlJSON(p)}else{els.outJSON.textContent=''}
if(asXML){var px=prettyXML(text);els.outXML.innerHTML=hlXML(px)}else{els.outXML.textContent=''}
if(asHTML){els.outHTML.srcdoc=text}else{els.outHTML.removeAttribute('srcdoc')}
els.outPlain.textContent=text;
els.outCurl.textContent=makeCurl(url,method,headers,body||'');
if(asJSON)switchTab('json');else if(asXML)switchTab('xml');else if(asHTML)switchTab('html');else switchTab('plain');
saveHistory({method:method,url:url,headers:headers,body:body||'',ctJson:els.ctJson.checked});
});
}).catch(function(e){
els.status.textContent='Fehler';
els.outPlain.textContent=(e&&e.message)?e.message:String(e);
els.outCurl.textContent=makeCurl(url,method,headers,body||'');
switchTab('plain');
});
}
els.send.addEventListener('click',send);
els.copy.addEventListener('click',function(){
var active=root.querySelector('.sd-r__code.sd-is-active');
var text=active?active.innerText:(els.outHTML.getAttribute('srcdoc')||'');
if(navigator.clipboard){navigator.clipboard.writeText(text);return}
var ta=document.createElement('textarea');ta.value=text;document.body.appendChild(ta);ta.select();document.execCommand('copy');ta.remove();
});
els.download.addEventListener('click',function(){
var active=root.querySelector('.sd-r__code.sd-is-active');
var content=active?active.innerText:(els.outHTML.getAttribute('srcdoc')||'');
var blob=new Blob([content],{type:'text/plain;charset=utf-8'});
var a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='response.txt';
document.body.appendChild(a);a.click();a.remove();URL.revokeObjectURL(a.href);
});
els.url.addEventListener('keydown',function(ev){if((ev.ctrlKey||ev.metaKey)&&ev.key==='Enter')send()});
els.body.addEventListener('keydown',function(ev){if((ev.ctrlKey||ev.metaKey)&&ev.key==='Enter')send()});
})();
Praktisch zum Testen – aber sobald eine Schnittstelle wirklich angebunden oder neu gebaut werden muss, wird aus dem Tool ein Projekt. Genau hier setzt SERVIT an: API-Schnittstellen entwickeln und anbinden – ob ERP, CRM, Buchhaltung oder Zahlungsanbieter. Und wenn ein eigenes Backend dahintergehört, entsteht es sauber mit einem maßgeschneiderten Laravel-Backend.
Mit dem REST API Tester prüfst du Endpoints direkt im Browser. Wähle Methode und URL, setze Header, füge Body (raw) hinzu und sende den Request. Die Antwort siehst du übersichtlich als JSON, XML, HTML oder Plain – inklusive Status, Zeit, Größe und Content-Type.
Features:
Header-Editor inkl. Bearer/Basic-Auth
Body raw; optional Content-Type: application/json
cURL-Kommando zum Kopieren
History deiner letzten Requests (localStorage)
Response-Headers einsehbar
Optionaler CORS-Proxy für APIs ohne CORS
Datenschutz: Das Tool läuft im Browser. Wir speichern oder übertragen keine Inhalte – außer deinem Request zur Ziel-API (bzw. über deinen eigenen Proxy, wenn aktiviert).