这里,我们拿友盟的推送接口做个测试,它是要求同时提交get参数和post参数,post参数内容为json串,需要引用DateUtils和md5算法单元;其实就是按流的形式进行提交就可以了,和拼接xml去post请求soap接口是一个道理,代码如下:
procedure TForm1.Button3Click(Sender: TObject);
var
vHttp: TNetHTTPClient;
vS, vR: TStringStream;
appkey, ams, timestamp, method, url, body, md5: string;
begin
vHttp := TNetHTTPClient.Create(nil);
vS := TStringStream.Create('', TEncoding.UTF8);
vR := TStringStream.Create('', TEncoding.UTF8);
try
with vHttp do
begin
ConnectionTimeout := 2000; // 2秒
ResponseTimeout := 10000; // 10秒
AcceptCharSet := 'utf-8';
AcceptEncoding := '65001';
AcceptLanguage := 'zh-CN';
ContentType := 'application/json';
UserAgent := 'Embarcadero URI Client/1.0';
appkey := '您的AppKey';
ams := '您的App Master Secret';
timestamp := FloatToStr(DateTimeToUnix(now, False));//返回unix时间戳
method := 'POST';
url := 'http://msg.umeng.com/api/send';
body := '{"appkey":"' + appkey + '",'
+ '"timestamp":"' + timestamp + '",'
+ '"type":"customizedcast",'
// +'"device_tokens":"",'
+ '"alias_type": "别名类型",'
+ '"alias":"别名1,别名2",'
+ '"payload":{"aps":{"alert": "您好!祝您生活愉快!'
+ '","badge":1,"sound":"default"}},'
+ '"description": "测试"}';
vS.WriteString(method + url + body + ams);//友盟要求的签名算法
md5 := LowerCase(MD5Print(MD5Stream(vS)));//签名要用md5输出,小写32位
vS.Clear;
vS.WriteString(body);
vS.Position := 0;
try
Post(url + '?sign=' + md5, vS, vR);//拼接url并进行post提交
Memo1.Lines.Add('post:' + vR.DataString);
except
on E: Exception do
// Error sending data: (12002) 操作超时.
// Error receiving data: (12002) 操作超时
if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error sending data'
then
Memo1.Lines.Add('post:连接失败!')
else if Copy(E.Message, 1, Pos(':', E.Message) - 1) = 'Error receiving data'
then
Memo1.Lines.Add('post:接收失败,请延长接收超时时间!')
else
Memo1.Lines.Add('post:' + E.Message);
end;
end;
finally
vS.Free;
vR.Free;
vHttp.Free;
end;
end;