使用包含头的原始消息从javascript发出HTTP请求

使用包含头的原始消息从javascript发出HTTP请求,javascript,jquery,http,rest,http-headers,Javascript,Jquery,Http,Rest,Http Headers,我知道如何使用jQuery或XMLHttpRequest从javascript向RESTAPI发出HTTP请求。我现在要做的是在不设置头值属性的情况下发出请求。一个系统包括: 请求行,例如GET/images/logo.png HTTP/1.1,它从服务器请求名为/images/logo.png的资源 标题,例如接受语言:en 空行 可选的消息正文 对my api的请求应如下所示: GET /myapi/myresource/1234 HTTP/1.1 Host: localhost:511

我知道如何使用jQuery或XMLHttpRequest从javascript向RESTAPI发出HTTP请求。我现在要做的是在不设置头值属性的情况下发出请求。一个系统包括:

  • 请求行,例如GET/images/logo.png HTTP/1.1,它从服务器请求名为/images/logo.png的资源
  • 标题,例如接受语言:en
  • 空行
  • 可选的消息正文
对my 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>
GET/myapi/myresource/1234http/1.1
主机:localhost:51127
内容类型:application/x-www-form-urlencoded
接受:application/json、text/csv
授权:基本
我想打开到localhost:51127的连接,发送上面的文本,并获得响应。这在javascript中可能吗

更新:我知道如何设置标题。我 只是想用另一种方式。 有很多方法可以“构建”一个 请求包括标题并发送。 我只想手动构建它


您可以获取HmlHttpRequest对象的实例并使用setRequestHeader

jQuery有一个beforeSend处理程序,您可以设置它来获取实际的hxr对象

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

Javascript中没有套接字支持。您只能使用
XMLHTTPRequest
包装器构建HTTP查询,也可以选择使用
jQuery.ajax
等包装器构建HTTP查询。这是出于各种各样的原因,主要是出于安全考虑。

来这里也是为了同样的目的。我认为可以构建一些东西,它接受原始请求文本并将其解析为xmlHttpRequest对象,将头等放入正确的属性中。请评论一个链接,如果类似的东西已经存在。基本上,如果jQuery有一个构建requestfromRaw(文本)的函数,那就太棒了

在lonesomeday的答案的基础上,下面是实际操作的方法

函数请求(txt,cb){
设x=new XMLHttpRequest(),
lines=txt.split(“\n”),
方法=[
“得到”,
“职位”,
“补丁”,
“放”,
“删除”,
“头”,
“选项”
],
主机,路径,方法,版本,body=”“,headers={}
forEach((x,i)=>{
如果(!x.includes(“:”){
让ind;
methods.forEach(m=>{
设tmpIndex=x.indexOf(m);
如果(tmpIndex>-1){
if(!方法){
ind=tmpIndex;
让words=x.split(“”);
方法=x.substring(
tmpIndex,
tmpIndex+
m、 长度
);
method=method&&method.trim();
路径=单词。查找((y,k)=>
y[0]==“/”
)
path=path&&path.trim();
版本=(
x
.替换(方法“”)
.replace(路径“”)
).trim();
}
}
});
}否则{
设indexOfSemiColon=x.indexOf(“:”);
如果(
indexOfSemiColon>0&&
indexOfSemiColon
x===“”
&&内推(一)
)
让我们来打破指数;
inds.forEach((x,i)=>{
如果(
i{
如果(x.readyState==4&&x.status==200){
if(cb)cb(x.响应);
} 
}
if(主机&路径&方法){
x、 打开(
方法
“http://”//不知道如何区分http和https,如果有人能帮上忙,那就太好了
+主人
+路径
);
for(让k在标题中){
x、 setRequestHeader(k,headers[k]);
}
x、 发送(正文);
}
返回{
标题,
身体
方法
主办
路径
版本
}//对于测试,只需返回我们找到的所有值
}
console.log(
请求(`
获取/搜索?q=测试HTTP/2
主持人:www.bing.com
用户代理:curl/7.54.0
接受:*/*`
),
请求(`
GET/foo/bar HTTP/1.1
主持人:example.org
用户代理:Mozilla/5.0(Macintosh;U;Intel Mac OS X 10.6;fr;rv:1.9.2.8)Gecko/20100722 Firefox/3.6.8
接受:*/*
接受语言:fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
接受编码:gzip,deflate
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7
活命:115
连接:保持活力
内容类型:application/x-www-form-urlencoded
X-request-With:XMLHttpRequest
推荐人:http://example.org/test
Cookie:foo=bar;lorem=ipsum;
`),
请求(`
GET/myapi/myresource/1234http/1.1
主机:localhost:51127
内容类型:application/x-www-form-urlencoded
接受:application/json、text/csv
授权:基本
`)

)
See.jQuery.get是我现在使用jQuery.ajax所做工作的快捷方式。这将为您指定标头,可以使用属性和回调覆盖这些标头。我想用上面的格式指定标题和内容。这就是我现在要做的。我不想这样设置标题。我想发送一个格式正确的http请求,其中已经包含了头。