InDesign 套接字 HTTP 响应缺少部分
InDesign Socket HTTP response is missing sections
我正在使 Adobe InDesign 自动化,以使用从具有 SQL 服务器后端的 Web API 收集的 JSON 数据创建文档。我正在使用 Sockets 对象对我们的服务器进行 HTTP 1.0 调用。有时收到的响应从 JSON 字符串中的各个点丢失了大约 1700 个字符,但是当我使用 curl 或 Postman 调用相同的 API 端点时,我得到了完整且有效的响应。
回复应该有 150k 个字符长,我正在使用 conn.read(99999999) 来阅读它。此外,字符串末尾的外观看起来是正确的,所以我不认为这是任何类型的截断问题。
问题似乎只在我请求 UTF-8 编码时出现。如果我请求 ASCII,我会得到一个完整且有效的响应,但缺少各种 Unicode 字符。如果我请求 BINARY,我会得到一个完整且有效的响应,但 JavaScript/ExtendScript 似乎正在处理作为单个字节接收的任何多字节 Unicode 字符,而不是我们想要显示的 Unicode 字符。
这是我所看到的使用虚假数据的行为说明...
"Expected" 回复...
[{"Id":1, "name":"Random Name", "Text":"A bunch of text", "AnotherId": 1}]
"Actual" 回复...
[{"Id":1, "name":"Random Name", "Text":"A bunc": 1}]
问题首先表现为 JSON2 解析错误,原因很明显,但问题的根源似乎是部分数据在传输过程中丢失。
到目前为止,我们只在使用 InDesign 套接字对象进行调用时看到了这个问题,并不是每个响应都表现出这种行为。
如果您能提供任何帮助或见解,我们将不胜感激。
这是我用来调用数据的函数...
function httpRequest(url, encoding) {
try {
var response = "";
var hostName = getHostFromUrl(url);
var pathAndQuery = getPathAndQueryFromUrl(url);
var httpGet = "GET ";
httpGet += pathAndQuery;
httpGet += " HTTP/1.0\r\nHost: ";
httpGet += hostName;
httpGet += "\r\n";
var conn = new Socket;
conn.timeout = 30;
//conn.encoding = encoding || "UTF-8";
//conn.charset = "UTF-16";
if (conn.open(hostName + ":80", encoding || "UTF-8")) {
// send a HTTP GET request
conn.writeln(httpGet);
// and read the server's response
response = conn.read(99999999);
conn.close();
}
return parseHttpResponse(response);
}
catch (e) {
$.writeln(e);
$.global.alert("There was a problem making an HTTP Request: " + e);
return null;
}
}
原来我对 HTTP 响应的处理过于简单,需要额外的逻辑才能正确处理 Unicode 字符。
就我而言,解决方案是使用 Kris Coppieter here 提供的 GetURL 方法。
我正在使 Adobe InDesign 自动化,以使用从具有 SQL 服务器后端的 Web API 收集的 JSON 数据创建文档。我正在使用 Sockets 对象对我们的服务器进行 HTTP 1.0 调用。有时收到的响应从 JSON 字符串中的各个点丢失了大约 1700 个字符,但是当我使用 curl 或 Postman 调用相同的 API 端点时,我得到了完整且有效的响应。
回复应该有 150k 个字符长,我正在使用 conn.read(99999999) 来阅读它。此外,字符串末尾的外观看起来是正确的,所以我不认为这是任何类型的截断问题。
问题似乎只在我请求 UTF-8 编码时出现。如果我请求 ASCII,我会得到一个完整且有效的响应,但缺少各种 Unicode 字符。如果我请求 BINARY,我会得到一个完整且有效的响应,但 JavaScript/ExtendScript 似乎正在处理作为单个字节接收的任何多字节 Unicode 字符,而不是我们想要显示的 Unicode 字符。
这是我所看到的使用虚假数据的行为说明...
"Expected" 回复...
[{"Id":1, "name":"Random Name", "Text":"A bunch of text", "AnotherId": 1}]
"Actual" 回复...
[{"Id":1, "name":"Random Name", "Text":"A bunc": 1}]
问题首先表现为 JSON2 解析错误,原因很明显,但问题的根源似乎是部分数据在传输过程中丢失。
到目前为止,我们只在使用 InDesign 套接字对象进行调用时看到了这个问题,并不是每个响应都表现出这种行为。
如果您能提供任何帮助或见解,我们将不胜感激。
这是我用来调用数据的函数...
function httpRequest(url, encoding) {
try {
var response = "";
var hostName = getHostFromUrl(url);
var pathAndQuery = getPathAndQueryFromUrl(url);
var httpGet = "GET ";
httpGet += pathAndQuery;
httpGet += " HTTP/1.0\r\nHost: ";
httpGet += hostName;
httpGet += "\r\n";
var conn = new Socket;
conn.timeout = 30;
//conn.encoding = encoding || "UTF-8";
//conn.charset = "UTF-16";
if (conn.open(hostName + ":80", encoding || "UTF-8")) {
// send a HTTP GET request
conn.writeln(httpGet);
// and read the server's response
response = conn.read(99999999);
conn.close();
}
return parseHttpResponse(response);
}
catch (e) {
$.writeln(e);
$.global.alert("There was a problem making an HTTP Request: " + e);
return null;
}
}
原来我对 HTTP 响应的处理过于简单,需要额外的逻辑才能正确处理 Unicode 字符。
就我而言,解决方案是使用 Kris Coppieter here 提供的 GetURL 方法。