Delphi HTTP Post JSON

前端 未结 2 1710
闹比i
闹比i 2021-01-02 06:47

I am sure I\'m doing something wrong here. I\'ve followed every example I can find on stackoverflow and still haven\'t gotten this to work in my environment. I\'d love to up

相关标签:
2条回答
  • 2021-01-02 07:15

    HTTP1.Request.ContentEncoding should be HTTP1.Request.CharSet instead. UTF-8 is a charset encoding, not a content encoding. And then make sure your JSON data is actually encoded to UTF-8 before posting it. If you are using ASCII characters, the TStringStream code you showed is fine. But if you are using non-ASCII Characters, you need to encode them, such as with Utf8Encode(). TIdHTTP does not encode TStream data, it is sent as-is.

    Procedure Tformmaintestbed.btnJSONSendClick(Sender: TObject);
    var
      Json: string;
      sResponse: string;
      JsonToSend: TStringStream;
    begin
      Json := '{"auth": {"applicationId": "' + edApplication.text +
        '","applicationPassword": "' + edpassword.text +
        '","accountId": "' + edaccount.text +
        '","userId": "' + edUser.text +
        '"}}';
    
      memoRequest.Text := Json;
    
      JsonToSend := TStringStream.Create(Utf8Encode(Json)); // D2007 and earlier only
      //in D2009 and later, use this instead:
      //JsonToSend := TStringStream.Create(Json, TEncoding.UTF8);
      try
        HTTP1.Request.ContentType := 'application/json';
        HTTP1.Request.CharSet := 'utf-8';
    
        try
          sResponse := HTTP1.Post(cbAddress.Text, JsonToSend);
        except
          on E: Exception do
            ShowMessage('Error on request: '#13#10 + e.Message);
        end;
      finally
        JsonToSend.Free;
      end;
    
      memoResponse.Text := sResponse;
    end;
    

    Alternatively:

    Procedure Tformmaintestbed.btnJSONSendClick(Sender: TObject);
    var
      Json: string;
      sResponse: string;
      JsonToSend: TMemoryStream;
    begin
      Json := '{"auth": {"applicationId": "' + edApplication.text +
        '","applicationPassword": "' + edpassword.text +
        '","accountId": "' + edaccount.text +
        '","userId": "' + edUser.text +
        '"}}';
    
      memoRequest.Text := Json;
    
      JsonToSend := TMemoryStream.Create;
      try
        WriteStringToStream(JsonToSend, Json, enUTF8);
        JsonToSend.Position := 0;
    
        HTTP1.Request.ContentType := 'application/json';
        HTTP1.Request.CharSet := 'utf-8';
    
        try
          sResponse := HTTP1.Post(cbAddress.Text, JsonToSend);
        except
          on E: Exception do
            ShowMessage('Error on request: '#13#10 + e.Message);
        end;
      finally
        JsonToSend.Free;
      end;
    
      memoResponse.Text := sResponse;
    end;
    
    0 讨论(0)
  • 2021-01-02 07:37

    Please try this:

    procedure TForm1.Button1Click(Sender: TObject);
        var
            s: String;
            Resp_Json: string;
            Req_Json:TStream;
    begin
        s:='state=1';
        s:=s+'&kind=0';
        s:=s+'&tblid=0';
        Req_Json:=TstringStream.Create(s);
        Req_Json.Position:=0;
    
        try
            IdHTTP1.Request.UserAgent:='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36';
            IdHTTP1.Request.Accept := 'application/json, text/javascript, */*; q=0.01';
            IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded; charset=UTF-8';
            IdHTTP1.Request.CharSet:='utf-8';
            Resp_Json:=IdHTTP1.Post('http://[your URL]', Req_Json);
        finally
            Req_Json.Free;
        end;
    
        memo1.Lines.Add(IdHTTP1.ResponseText);
        memo1.Lines.Add(Resp_Json);
    end;
    
    0 讨论(0)
提交回复
热议问题