【发布时间】:2018-12-07 16:18:57
【问题描述】:
我有以下 Java 代码,我想在 Delphi 中进行转换。要在 JSON 中获得响应,下面的 java 代码用于从服务器获取令牌。 eclipse 中的代码有想要的结果,但是当我尝试在 Delphi 中转换代码时,我得到了来自“非法用户”的服务器的响应。
我认为错误在于发送请求。下面的代码在 Delphi 中做正确的请求吗?
Java 代码:
headerMap.put("Content-Type", "application/x-www-form-urlencoded");
private static void sendPost(Map<String, String> headerMap, Map<String, String> paramMap) {
try {
HttpPost post = new HttpPost(openapi_url);
List<NameValuePair> list = new ArrayList<NameValuePair>();
for (String key : paramMap.keySet()) {
list.add(new BasicNameValuePair(key, paramMap.get(key)));
}
post.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
if (null != headerMap) {
post.setHeaders(assemblyHeader(headerMap));
}
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpResponse response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity, "utf-8"));
} catch (IOException e) {
System.err.println(e);
}
}
/**
*
* @param headers
* @return
*/
private static Header[] assemblyHeader(Map<String, String> headers) {
Header[] allHeader = new BasicHeader[headers.size()];
int i = 0;
for (String str : headers.keySet()) {
allHeader[i] = new BasicHeader(str, headers.get(str));
i++;
}
return allHeader;
}
德尔福代码:
ParamList := TStringList.Create();
for item in Dictionary do
begin
ParamList.Add(item.Key + '=' + item.Value);
end;
for I := 0 to Dictionary.Count-1 do begin
Memo1.Lines.Add(ParamList.Strings[I]);
end;
try
lHTTP := TIdHTTP.Create;
lHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
lHTTP.Request.CharSet := 'utf-8';
try
memo2.Lines.Text := lHTTP.Post(openapi_url, ParamList);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + e.Message);
end
finally
lHTTP.Free;
ParamList.Free;
end;
【问题讨论】:
-
首先检查您发送到服务器的字符串。 IE。 headers,我认为 header 格式应该是
name:value\r\n。 W3C -
您显示的 Delphi 代码很好,就准备 POST 参数列表而言。但是您的 Java 代码还可以选择设置 HTTP 标头,而您的 Delphi 代码没有这样做。您可以使用
TIdHTTP.Request.CustomHeaders属性添加TIdHTTP.Request子属性尚未涵盖的任何自定义标头。例如,身份验证凭据/令牌。此外,还有一点需要记住 - 一些服务器对User-Agent请求标头很敏感,因此您可能需要设置TIdHTTP.Request.UserAgent以模仿HttpPost或真正的 Web 浏览器会发送的内容。
标签: java json api delphi-10.2-tokyo