比较简单的问题,好久没用Delphi了,折腾了一番。
首先确定Tomcat中的应用,能够正确得到中文参数,没有乱码,这个不说了,网上太多文章了
然后写一段Java测试程序:
public ActionForward t1(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
D7Form f = (D7Form)form;
String s = f.getS();
String t = f.getT();
System.out.println(s);
System.out.println(t);
JSONObject j = new JSONObject();
try {
j.put("r" , Integer.valueOf(1));
j.put("s", "测试");
System.out.println(j.toString());
response.setContentType("text/json;charset=utf-8");
response.getOutputStream().write(j.toString().getBytes("UTF-8"));
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
代码很简单,仅仅是Debug用。首先System.out出来Form中的参数s,t;然后用假的数据拼装成JSONObject,写到Response中。
Delphi部分的代码如下:
procedure TForm1.btn1Click(Sender: TObject);
var
url:String;
param: TIdMultiPartFormDataStream;
Response: TStringStream;
begin
url := 'http://localhost/d7.do?state=t1';
param := TIdMultiPartFormDataStream.Create;
try
param.AddFormField('s','offers');
param.AddFormField('t', AnsiToUtf8('提交中文测试'));
Response := TStringStream.Create('');
idhtp.Post(url, param, Response);
mmo1.Text := Utf8ToAnsi(Response.DataString);
finally
Response.Free;
param.Free;
end;
end;
关键是AnsiToUTF8函数。这里用的Indy组件是比较老的版本9,AddFormField没有第三个编码参数,所以要用AnsiToUtf8转换一下。