简体   繁体   English

来自 javascript 的 HTTP 请求使用包含标头的原始消息

[英]HTTP request from javascript using raw message including headers

I know how to make an HTTP request to my REST api from javascript using jQuery or XMLHttpRequest.我知道如何使用 jQuery 或 XMLHttpRequest 从 javascript 向我的 REST api 发出 HTTP 请求。 What I want to do now is make the request without setting properties for the header values.我现在想做的是在不设置标头值属性的情况下发出请求。 An HTTP request message consists of: HTTP 请求消息包括:

  • Request line, such as GET /images/logo.png HTTP/1.1, which requests a resource called /images/logo.png from server请求行,例如 GET /images/logo.png HTTP/1.1,它从服务器请求名为 /images/logo.png 的资源
  • Headers, such as Accept-Language: en标头,例如 Accept-Language: en
  • An empty line空行
  • An optional message body一个可选的消息体

A request to my api should look something like this:对我的 api 的请求应如下所示:

GET /myapi/myresource/1234 HTTP/1.1
Host: localhost:51127
Content-Type: application/x-www-form-urlencoded
Accept: application/json, text/csv
Authorization: Basic <base64 encoded credentials>

I would like to open a connection to localhost:51127, send the above text, and get the response.我想打开一个到 localhost:51127 的连接,发送上面的文本,然后得到响应。 Is this possible in javascript?这在javascript中可能吗?

Update: I know how to set headers.更新:我知道如何设置标题。 I just want to do it a different way.我只是想以不同的方式来做。 There are lots of ways to "build" a request including headers and send it.有很多方法可以“构建”包含标头的请求并发送它。 I just want to build it manually.我只想手动构建它。

You can possibly get an instance of the HmlHttpRequest object and use the setRequestHeader.您可以获取 HmlHttpRequest 对象的实例并使用 setRequestHeader。

jQuery has a beforeSend handler you can set to get the actual hxr object. jQuery 有一个 beforeSend 处理程序,您可以设置它来获取实际的 hxr 对象。

  $.ajax({
      beforeSend: function(xhr){
          xhr.setRequestHeader("name","value");
       }
  ...
  })

There is no socket support in Javascript. Javascript 中没有套接字支持。 You can only build HTTP queries by using the XMLHTTPRequest wrapper, or optionally wrappers for that such as jQuery.ajax .你只能建立HTTP查询使用XMLHTTPRequest包装,或任选对于诸如包装jQuery.ajax This is for all kinds of good reasons, principally security.这是出于各种充分的理由,主要是安全性。

To build on lonesomeday's answer, here's how to actually do it.为了建立在lonesomeday's answer的基础上,以下是实际操作方法。

 function rawRequest(txt,cb) { let x = new XMLHttpRequest(), lines = txt.split("\\n"), methods = [ "GET", "POST", "PATCH", "PUT", "DELETE", "HEAD", "OPTIONS" ], host, path, method, version, body = "", headers = {} lines.forEach((x, i) => { if(!x.includes(":")) { let ind; methods.forEach(m => { let tmpIndex = x.indexOf(m); if(tmpIndex > -1) { if(!method) { ind = tmpIndex; let words = x.split(" "); method = x.substring( tmpIndex, tmpIndex + m.length ); method = method && method.trim(); path = words.find((y, k) => y[0] === "/" ) path = path && path.trim(); version = ( x .replace(method, "") .replace(path, "") ).trim(); } } }); } else { let indexOfSemiColon = x.indexOf(":"); if( indexOfSemiColon > 0 && indexOfSemiColon < x.length - 1 ) { let key = x.substring( 0, indexOfSemiColon ).trim(), value = x.substring( indexOfSemiColon + 1 ).trim(); headers[key] = value; if(key.toLowerCase() == "host") { host = value } } } }); let inds = [] txt.split(/\\r?\\n/).forEach((x,i)=> x === "" && inds.push(i) ) let afterTwoLineBreaksIndex; inds.forEach((x,i) => { if( i < inds.length - 2 && inds[i] === "" && inds[i + 1] === "" ) { afterTwoLineBreaksIndex = i + 1; } }); if(afterTwoLineBreaksIndex) { body = txt.substring( afterTwoLineBreaksIndex ) } x.onreadystatechange = () => { if(x.readyState == 4 && x.status == 200) { if(cb) cb(x.response); } } if(host && path && method) { x.open( method, "http://" //don't know how to differentiate between http & https, if some1 could help out would be greate + host + path ); for(let k in headers) { x.setRequestHeader(k, headers[k]); } x.send(body); } return { headers, body, method, host, path, version } //for testing just return all the values we found } console.log( rawRequest(` GET /search?q=test HTTP/2 Host: www.bing.com User-Agent: curl/7.54.0 Accept: */*` ), rawRequest(` GET /foo/bar HTTP/1.1 Host: example.org User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; fr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 Accept: */* Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Content-Type: application/x-www-form-urlencoded X-Requested-With: XMLHttpRequest Referer: http://example.org/test Cookie: foo=bar; lorem=ipsum; `), rawRequest(` GET /myapi/myresource/1234 HTTP/1.1 Host: localhost:51127 Content-Type: application/x-www-form-urlencoded Accept: application/json, text/csv Authorization: Basic <base64 encoded credentials> `) )

Came here looking for same thing.来这里寻找同样的东西。 I think it would be possible to build something which takes a raw request text and parses that to an xmlHttpRequest object putting the headers etc in the correct properties.我认为有可能构建一些接受原始请求文本并将其解析为 xmlHttpRequest 对象的东西,将标头等放在正确的属性中。 Pls comment a link if something like this already exists.如果这样的东西已经存在,请评论一个链接。 Basically if jQuery has a function to BuildRequestFromRaw(text) that would be awesome.基本上,如果 jQuery 有一个 BuildRequestFromRaw(text) 函数,那就太棒了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM