在Delphi FireMonkey中使用TIdHTTP.Put()
编写字符串流的正确方法是什么?
我有一个像这样的PHP API(苗条):
// Update user
$app->put('/api/user/update/{id}', function(Request $request, Response $response){
$id = $request->getAttribute('id');
$username = $request->getParam('username');
$password = $request->getParam('password');
$nama = $request->getParam('nama');
$alamat = $request->getParam('alamat');
$jenis_kelamin = $request->getParam('jenis_kelamin');
$foto = $request->getParam('foto');
$sql = "UPDATE user SET
username = :username,
password = :password,
nama = :nama,
alamat = :alamat,
jenis_kelamin = :jenis_kelamin,
foto = :foto
WHERE id = $id";
try{
// Get DB Object
$db = new db();
// Connect
$db = $db->connect();
$stmt = $db->prepare($sql);
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->bindParam(':nama', $nama);
$stmt->bindParam(':alamat', $alamat);
$stmt->bindParam(':jenis_kelamin', $jenis_kelamin);
$stmt->bindParam(':foto', $foto);
$stmt->execute();
echo '{"notice": {"text": "Customer Updated"}';
} catch(PDOException $e){
echo '{"error": {"text": '.$e->getMessage().'}';
}
});
Delphi中通过HTTP发布数据的过程如下:
procedure TForm3.updateexample;
var
lHTTP: TIdHTTP;
lParamList: TStringList;
stream : TStringStream;
mydata,json: string;
begin
json := 'username='+edtusername.Text+
'password='+edtpassword.Text+
'nama='+edtnama.Text+
'alamat='+edtalamat.Text+
'jenis_kelamin='+cbbjkel.Selected.Text+
'foto="'+edtalamat.text;
stream := TStringStream.Create(json,Tencoding.UTF8);
//create
lHTTP := TIdHTTP.Create(nil);
try
mydata := lHTTP.put
('http://myweblablalbalbala/api/user/update/'+id,stream);
if Pos('Customer Updated', mydata) > 0 then
begin
ShowMessage('Update Succes');
end
else
ShowMessage('update fail');
finally
lHTTP.Free;
lParamList.Free;
end;
end;
代码有效,但在发送更新后,数据会从此更改(更新前):
{"id":"1","username":"iboy","password":"123456","nama":"ishak","alamat":"cikupa","jenis_kelamin":"l","foto":"iboy.jpg"}
到此(更新后):
{"id":"1","username":"","password":"","nama":"","alamat":"","jenis_kelamin":"","foto":""}
你能帮帮我吗?通过HTTP I Delphi发布字符串流的正确方法是什么?
答案 0 :(得分:1)
您没有正确格式化TStringstream
数据。它甚至不是JSON(尽管你的变量名称)。而且您也没有设置TIdHTTP.Request.ContentType
属性,因此服务器知道您实际发送的数据类型。
如果您阅读Slim documentation,Slim支持开箱即用的以下媒体类型:
您尝试发送的数据最接近application/x-www-form-urlencoded
。这通常是使用TIdHTTP.Post()
代替TIdHTTP.Put()
发送的,方法是给TStrings
name=value
个Post()
对象。 application/x-www-form-urlencoded
将为您格式化Request.ContentType
格式的值,并设置PHP
属性以匹配。
您的PUT
期待POST
次请求而不是POST
次请求。根据Slim文档,您实际上可以通过以下任一方式发送PUT
请求并使其像_METHOD=PUT
请求一样:
在您的数据中包含application/x-www-form-urlencoded
值(仅限X-HTTP-Method-Override: PUT
)
包含procedure TForm3.UpdateExample;
var
lHTTP: TIdHTTP;
lParamList: TStringList;
lReply: string;
begin
lParamList := TStringList.Create;
try
lParamList.Add('username='+edtusername.Text);
lParamList.Add('password='+edtpassword.Text);
lParamList.Add('nama='+edtnama.Text);
lParamList.Add('alamat='+edtalamat.Text);
lParamList.Add('jenis_kelamin='+cbbjkel.Selected.Text);
lParamList.Add('foto='+edtalamat.Text);
lHTTP := TIdHTTP.Create(nil);
try
// use one of these, not both!
lParamList.Add('_METHOD=PUT');
lHTTP.Request.MethodOverride := 'PUT';
lReply := lHTTP.Post('http://myweblablalbalbala/api/user/update/'+id, lParamList);
if Pos('Customer Updated', lReply) > 0 then
ShowMessage('Update Success')
else
ShowMessage('Update Fail');
finally
lHTTP.Free;
end;
finally
lParamList.Free;
end;
end;
HTTP请求标头(适用于任何媒体类型)。
尝试更像这样的事情:
expr <- vector(length = 3, mode = "expression")
expr[[1]] <- quote(k[xy[.(i)]])
expr[[2]] <- quote(K[xx[.(i)]])
expr[[3]] <- quote(C[xx[.(i)]])
答案 1 :(得分:1)
另一种方式(没有Indy),多平台,比Indy更好:
$hash{frogs}->()