DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: webb123
今日帖子: 1
在线用户: 1
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 xiaotianwangzi (xiaotian) ★☆☆☆☆ -
普通会员
2021/4/14 16:50:04
标题:
idhttp使用Post数据失败,有前辈来帮忙看一下什么原因,谢谢。 浏览:1931
加入我的收藏
楼主: function TForm1.PostDemo:string ;
var
  IdHttp : TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
  Url : string;
  jsonToSend : TStringStream;
  postdata : TStringList;
begin
  IdHttp := TIdHTTP.Create(nil);
  IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  IdHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL;
  IdHttp.HandleRedirects := True;
  IdHttp.Request.ContentType := 'application/json;charset=UTF-8';
  IdHTTP.Request.AcceptCharSet := 'UTF-8';
  IdHTTP.Request.AcceptEncoding := 'UTF-8';
  IdHTTP.Request.AcceptLanguage := 'UTF-8';
  IdHTTP.Request.CharSet := 'UTF-8';
  IdHTTP.ProtocolVersion := pv1_1;
  jsonToSend := TStringStream.Create('',TEncoding.UTF8);
  postdata := TStringList.Create;
  try
postdata.Text := '{"carNo":"苏A12345","piTare":1000,"GW":2000,"time":202103231026}';   
 url:='http://127.0.0.1:8884/api/CarInfo';       //本地测试地址
    try
      IdHttp.Post(url,postdata,jsonToSend);
      Result :=jsonToSend.DataString;
    except
      on e : Exception do
      begin
        ShowMessage(e.Message);
      end;
    end;
  finally
   jsonToSend.free;
   IdHttp.free;
  end;

end;
----------------------------------------------
-
作者:
男 dlfsystem (dlfsystem) ★☆☆☆☆ -
盒子活跃会员
2021/4/14 17:39:56
1楼: 我这前也是用类似这段代码连接短信发送服务,后改用TNetHttpClient,也是一直没有成功(最后改用C#处理的),因为无测试环境,原因也一直没有找到,总是提示:http 501错误。
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2021/4/14 17:43:01
2楼: 报错也不提供只能瞎鸡巴 猜
https分几种 ,你确定你的dll支持 网站用的? 
有在线检测 自己丢地址检测吧(还特么能给你检测漏洞呢。)
不丢在线网站 直接关选项一个个试就知道是哪个咯,
此帖子包含附件:
PNG 图像
大小:12.7K
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2021/4/14 17:47:24
3楼: 1楼 501
https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660#5_2

501 Not Implemented
服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 xiaotianwangzi (xiaotian) ★☆☆☆☆ -
普通会员
2021/4/14 17:54:02
4楼: 收到,谢谢各位的讲解。
----------------------------------------------
-
作者:
男 wuxiangyang (wxy) ★☆☆☆☆ -
盒子活跃会员
2021/4/14 19:49:35
5楼: 在你的服务端地址方法名前加“update”,这样服务端接口方法就可以响应了
例如:   function CarInfo(): Boolean;
修改为: function updateCarInfo(): Boolean;
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2021/4/14 22:05:12
6楼: postdata : TStringList;
改为
postdata : String;
----------------------------------------------
-
作者:
男 xiaotianwangzi (xiaotian) ★☆☆☆☆ -
普通会员
2021/5/13 22:38:39
7楼: 收到,谢谢各位耐心讲解,问题解决了。
----------------------------------------------
-
作者:
男 glwang (glwang) ★☆☆☆☆ -
盒子活跃会员
2021/5/14 8:36:08
8楼: 我发现很多时候Delphi程序员出了问题都第一时间怀疑是Delphi的问题,而不是自己的问题
----------------------------------------------
作者:
男 mytion (mytion) ★☆☆☆☆ -
普通会员
2021/5/14 11:44:31
9楼: 这个问题很好解决,做一张网页浏览器打开,然后POST自己要提交的数据,用HTTP调试工具抓包,看看浏览器是怎么做的,然后Delphi模拟即可。

本身Delphi写此类代码就是模拟浏览器的行为。

我见过好多网站在发送Get时,对Json代码进行Base64编码后提交的,有的发送Post也会对Json数据进行Base64编码……具体为什么要这样,我就不清楚了。

我这里只是把自己知道的有限信息提供给你参考
----------------------------------------------
http://www.lsworks.net
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/5/14 19:20:27
10楼: 楼上,本身网页提交或者下载的数据,必须是符合 HTTP 协议的。

这种数据,可以是没任何格式的文本,也可能是图片,或者中文字符,等等。

JSON 数据,本质上是字符串。也有一些服务器要求的是 XML 数据而不是 JSON 数据。这个不重要,重要的是:它是字符串。

那么,服务器就会要求你对这些数据进行编码。也可能不要求进行编码。这个就要看 HTTP 页面里面的一些表头定义,比如编码方式,等等。编码方式也很多,比如有 BASE64,还有其它的编码方式。你去看 Indy 提供的控件,里面就有好几种编码方式的控件。

假设服务器要求你提供的数据必须按照什么方式编码,那你就必须要编码。最常见的是图片这种二进制数据,要求编码为 BASE64 的字符串再发送给服务器。当然,服务器也可能支持直接提交二进制数据,那就不用编码了。

总之,这些都是服务器方便的要求,做客户端的,搞清楚要求,自己的程序能满足要求,才可以传递数据给服务器。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/5/14 20:02:04
11楼: 关于如何去研究一个 HTTP 服务器的规则,我有个实际的例子,就是微软的 Azure 存储服务,如何用 Delphi 去访问。我写了一个比较详细的研究过程的博客,有兴趣的可以参考一下:

https://blog.csdn.net/pcplayer/article/details/86763311?spm=1001.2014.3001.5501

其本质是:
1. HTTP 访问其实就是一个 TCP 的访问,其 URL 是服务器的地址,以及一些给服务器看的参数;对于 TCP 来说,其实只需要服务器的地址。

2. HTTP 的内容,就是一大段的文本,可能也包含二进制数据。

3. HTTP 内容的一大段文本里面,最前面是 HTTP 头。这个头也是一堆文本,描述了这个 HTTP 是 GET 还是 PUT 还是 POST,描述了编码方式,等等。有一堆的参数。不同的服务器要求的参数可能不同。

4. 搞清楚了 HTTP 的内容格式,自己使用 IdTCPClient 也可以去访问服务器;

5. 使用 IdHTTP 去访问服务器,可能需要使用 IdTHHP 的方法,自己构造一些服务器需要的参数,也就是 HTTP 头里面的一些数据。因为每个服务器可能需要不同的参数,控件无法知道,需要使用控件的人自己去做。IdHTTP 有相应的方法允许你增加 HTTP 的头的参数。其实最终就是在 HTTP 的文本内容的 HTTP 头部分增加了类似:MY_NAME:PCPLAYER  这样的内容。
----------------------------------------------
-
作者:
男 yupor5 (yupor5) ★☆☆☆☆ -
普通会员
2021/5/17 20:56:02
12楼: http 库不少问题,不稳定,我后台用go写个http提交
----------------------------------------------
-
作者:
男 teclick (nelson) ★☆☆☆☆ -
普通会员
2021/7/8 9:43:21
13楼: 看注册时间,你也是前辈了,不过你的问题,至少应该把错误的提示内容发出来吧
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行109.375毫秒 RSS