Delphi Firemonkey http放置body参数



使用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张贴弦乐的正确方法是什么?

您没有正确格式化TStringstream数据。它甚至还没有成为JSON(尽管您的名称可变(。而且您也没有设置TIdHTTP.Request.ContentType属性,因此服务器知道您实际发送了哪种数据。

如果您阅读了Slim文档,则Slim支持以下媒体类型:

  • 应用程序/x-www-form-urlencoded
  • 应用程序/json
  • 应用程序/xml&文字/XML

您要发送的数据最接近application/x-www-form-urlencoded。通常,通过将其为TStrings对的CC_7对象,通常使用TIdHTTP.Post()而不是TIdHTTP.Put()发送。Post()将为您格式化application/x-www-form-urlencoded格式的值,并将Request.ContentType属性设置为匹配。

您的PHP期望PUT请求而不是POST请求。根据纤细的文档,您实际上可以发送POST请求,并使其像PUT请求一样,通过:

  • 在您的数据中包含_METHOD=PUT值(仅application/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;

最新更新