Delphi firemonkey HTTP Put body参数

时间:2017-04-22 07:27:28

标签: http delphi firemonkey put

在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发布字符串流的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您没有正确格式化TStringstream数据。它甚至不是JSON(尽管你的变量名称)。而且您也没有设置TIdHTTP.Request.ContentType属性,因此服务器知道您实际发送的数据类型。

如果您阅读Slim documentation,Slim支持开箱即用的以下媒体类型:

  • 应用程序/ x-WWW窗体-urlencoded
  • 应用/ JSON
  • application / xml&文本/ XML

您尝试发送的数据最接近application/x-www-form-urlencoded。这通常是使用TIdHTTP.Post()代替TIdHTTP.Put()发送的,方法是给TStrings name=valuePost()对象。 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}->()