Delphi firemonkey HTTP Put正文参数

Delphi firemonkey HTTP Put正文参数,http,delphi,firemonkey,put,Http,Delphi,Firemonkey,Put,在Delphi FireMonkey中使用TIdHTTP.Put()编写stringstream的正确方法是什么 我有一个PHP API(slim),如下所示: procedure TForm3.UpdateExample; var lHTTP: TIdHTTP; lParamList: TStringList; lReply: string; begin lParamList := TStringList.Create; try lParamList.Add('us

在Delphi FireMonkey中使用
TIdHTTP.Put()
编写stringstream的正确方法是什么

我有一个PHP API(slim),如下所示:

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;
//更新用户
$app->put('/api/user/update/{id}',函数(请求$Request,响应$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=“更新用户集”
用户名=:用户名,
密码=:密码,
娜玛=:娜玛,
阿拉马特=:阿拉马特,
jenis_kelamin=:jenis_kelamin,
foto=:foto
其中id=$id”;
试一试{
//获取数据库对象
$db=新的db();
//连接
$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();
回显“{”通知“{”文本“:“客户更新”}”;
}捕获(PDO$e){
回显“{”错误“:{”文本“.$e->getMessage().}”;
}
});
Delphi中通过HTTP发布数据的过程如下:

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;
程序TForm3.updateexample;
变量
lHTTP:TIdHTTP;
lParamList:TStringList;
溪流:TStringStream ;;
mydata,json:string;
开始
json:='username='+edtusername.Text+
“password=”+edtpassword.Text+
“nama=”+edtnama.Text+
“alamat=”+edtalmat.Text+
“jenis_kelamin=”+cbbjkel.Selected.Text+
'foto=“”+edtalmat.text;
stream:=TStringStream.Create(json,Tencoding.UTF8);
//创造
lHTTP:=TIdHTTP.Create(nil);
尝试
mydata:=lHTTP.put
('http://myweblablalbalbala/api/user/update/“+id,流);
如果Pos(‘客户更新’,mydata)>0,则
开始
ShowMessage(“更新成功”);
结束
其他的
ShowMessage(“更新失败”);
最后
lHTTP.Free;
lParamList.Free;
结束;
结束;
代码可以工作,但在发送更新后,数据会从此更改(在更新之前):

{“id”:“1”,“username”:“iboy”,“password”:“123456”,“nama”:“ishak”,“alamat”:“cikupa”,“jenis_kelamin”:“l”,“foto”:“iboy.jpg”}
对此(更新后):

{“id”:“1”、“用户名”:“密码”:“nama”:“alamat”:“jenis_kelamin”:“foto”:”

您能帮助我吗?通过HTTP I Delphi发布stringstream的正确方法是什么?

您没有正确格式化
TStringstream
数据。它甚至不接近JSON(尽管您使用了变量名)。并且您也没有设置
TIdHTTP.Request.ContentType
属性,以便服务器知道您实际发送的数据类型

如果阅读,Slim支持以下开箱即用介质类型:

  • 应用程序/x-www-form-urlencoded
  • 应用程序/json
  • application/xml和text/xml
您尝试发送的数据最接近
application/x-www-form-urlencoded
。通常使用
TIdHTTP.Post()
而不是
TIdHTTP.Put()
,通过给它一个
TStrings
对象,即
name=value
对。
Post()
将为您格式化
应用程序/x-www-form-urlencoded
格式中的值,并将
请求.ContentType
属性设置为匹配

您的
PHP
需要的是
PUT
请求,而不是
POST
请求。根据Slim文档,您实际上可以发送
POST
请求,并通过以下方式使其像
PUT
请求一样工作:

  • 包括
    \u方法=将
    值放入数据中(
    应用程序/x-www-form-urlencoded

  • 包括
    X-HTTP-Method-Override:PUT
    HTTP请求头(适用于任何媒体类型)

尝试类似以下内容:

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;
另一种方式(没有Indy),多平台,比使用Indy更好:

function Upload(const aFilePath: string): boolean;
var
  vData: TMultipartFormData; // uses System.Net.Mime
  vHTTP: THTTPClient; // uses System.Net.HttpClient
  vCRC: cardinal;
  vURL: string;
  vResp: TStringStream;
begin
  vURL := 'PHP url';
  vResp := TStringStream.Create('');
  vData := TMultipartFormData.Create();
  vHTTP := THTTPClient.Create;
  try
    try
      vData.AddField('version', MyVerField.ToString);
      vData.AddField('crc', MyCRC.ToString);

      vData.AddFile('db_file', aFilePath);
      Result := vHTTP.Post(vURL, vData, vResp).StatusCode = 200;

      if Result then 
        Result := vResp.DataString.ContentAsString().Contains('"result":true');          

    except
      Result := false;
    end;
  finally
    vHTTP.Free;
    vData.Free;
    vResp.Free; 
  end;
end;