JSA通过winhttp发送二进制请求

wils
wils Lv.2 潜力创作者

Lv.2潜力创作者

前几天有论坛上的朋友问,JSA里的fetch不能发送二进制请求,怎么办

确实,JSA里的fetch功能不全,不能收发二进制,很多方法不能用


今天尝试通过ffi调用winhttp来发送二进制请求

🔔

function tt() {

const {WinHttpOpen, WinHttpConnect, WinHttpOpenRequest, WinHttpSendRequest, WinHttpReceiveResponse, WinHttpCloseHandle} = ffi.LoadLibrary('winhttp', {

WinHttpOpen: {

returnType: "pointer",

parameters: ["u16string", "uint32", "pointer", "pointer", "uint32"]

},

WinHttpConnect: {

returnType: "pointer",

parameters: ["pointer", "u16string", "uint32", "uint32"]

},

WinHttpOpenRequest: {

returnType: "pointer",

parameters: ["pointer", "u16string", "u16string", "pointer", "pointer", "pointer", "uint32"]

},

WinHttpSendRequest: {

returnType: "bool",

parameters: ["pointer", "pointer", "uint32", "pointer", "uint32", "uint32", "pointer"]

},

WinHttpReceiveResponse: {

returnType: "bool",

parameters: ["pointer", "pointer"]

},

WinHttpCloseHandle: {

returnType: "bool",

parameters: ["pointer"]

}

});

const data = new Uint8Array([0xDE, 0xAD, 0xBE, 0xEF]).buffer;

let hSession = null, hConnect = null, hRequest = null;

try {

hSession = WinHttpOpen("WPS", 0, null, null, 0);

hConnect = WinHttpConnect(hSession, "httpbin.org", 443, 0);

hRequest = WinHttpOpenRequest(hConnect, "POST", "/post", null, null, null, 0x00800000);

const sendOk = WinHttpSendRequest(

hRequest,

null, 0,

data, data.byteLength, data.byteLength,

null

);

const recvOk = WinHttpReceiveResponse(hRequest, null);

console.log(recvOk);

} finally {

[hRequest, hConnect, hSession].forEach(handle => handle && WinHttpCloseHandle(handle));

}

}

基本都是用ai写的,能用就行🤣

除了写起来麻烦,功能上各种需求都能实现,比较满意

但是,Linux里想用类似的方法使用libcurl,一直没有成功,希望更多朋友来尝试,希望大佬指点,多谢

海南省
浏览 168
2
9
分享
9 +1
1
2 +1
全部评论 1
 
宁??
感谢分享
· 湖南省
回复