【问题标题】:Sending SMS through API from Delphi从 Delphi 通过 API 发送 SMS
【发布时间】:2018-06-30 11:57:57
【问题描述】:

我想使用在线 API 从 Delphi 发送 SMS。

API 由服务提供商提供,通过网络浏览器使用时可以使用,如下所示:

http://sendpk.com/api/sms.php?username=xxxx&password=xxxx&sender=Masking&mobile=xxxx&message=Hello

上面的网址通过网络浏览器打开时可以正常工作,并且短信发送成功。现在,我正在努力将 API 集成到我的 Delphi 应用程序中。

通过网上搜索,找到了一些例子,最后尝试了下面的代码:

var
  lHTTP: TIdHTTP;
  lParamList: TStringList;
begin
  lParamList := TStringList.Create;
  lParamList.Add('username=xxxx');
  lParamList.Add('password=xxxx');
  lParamList.Add('sender=Masking');
  lParamList.Add('mobile=xxxx');
  lParamList.Add('message=Hello');

  lHTTP := TIdHTTP.Create;    

  try
    PostResult.Lines.Text := lHTTP.Post('http://sendpk.com/api/sms.php', lParamList);
  finally
    lHTTP.Free;
    lParamList.Free;
  end;

但我收到一个错误:

HTTP/1.1 406 Not Acceptable

服务提供商网站上提供的 API 参考如下:

http://sendpk.com/api.php

请指导我。我做错了什么,正确的代码是什么?

编辑

API参考中提供的C#代码如下:

using System;
using System.Net;
using System.Web;

public class Program
{
    public static void Main()
    {
        string MyUsername = "userxxx"; //Your Username At Sendpk.com
        string MyPassword = "xxxx"; //Your Password At Sendpk.com
        string toNumber = "92xxxxxxxx"; //Recepient cell phone number with country code
        string Masking = "SMS Alert"; //Your Company Brand Name
        string MessageText = "SMS Sent using .Net";
        string jsonResponse = SendSMS(Masking, toNumber, MessageText, MyUsername, MyPassword);
        Console.Write(jsonResponse);
        //Console.Read(); //to keep console window open if trying in visual studio
    }

    public static string SendSMS(string Masking, string toNumber, string MessageText, string MyUsername , string MyPassword)
    {
        String URI = "http://sendpk.com" +
            "/api/sms.php?" +
            "username=" + MyUsername +
            "&password=" + MyPassword +
            "&sender=" + Masking +
            "&mobile=" + toNumber +
            "&message=" + Uri.UnescapeDataString(MessageText); // Visual Studio 10-15
        try
        {
            WebRequest req = WebRequest.Create(URI);
            WebResponse resp = req.GetResponse();
            var sr = new System.IO.StreamReader(resp.GetResponseStream());
            return sr.ReadToEnd().Trim();
        }
        catch (WebException ex)
        {
            var httpWebResponse = ex.Response as HttpWebResponse;
            if (httpWebResponse != null)
            {
                switch (httpWebResponse.StatusCode)
                {
                    case HttpStatusCode.NotFound:
                        return "404:URL not found :" + URI;
                        break;
                    case HttpStatusCode.BadRequest:
                        return "400:Bad Request";
                        break;
                    default:
                        return httpWebResponse.StatusCode.ToString();
                }
            }
        }
        return null;
    }
}

【问题讨论】:

  • 不确定,但我认为这不应该是 POST,应该是 GET。

标签: delphi indy idhttp


【解决方案1】:

您需要使用TIdHTTP.Get() 而不是TIdHTTP.Post()

var
  lHTTP: TIdHTTP;
  lUser, lPass, lSender, lMobile, lMsg: string;
begin
  lUser := 'xxxx';
  lPass := 'xxxx';
  lSender := 'Masking';
  lMobile := 'xxxx';
  lMsg := 'Hello';

  lHTTP := TIdHTTP.Create;
  try
    PostResult.Lines.Text := lHTTP.Get('http://sendpk.com/api/sms.php?username=' + TIdURI.ParamsEncode(lUser) + '&password=' + TIdURI.ParamsEncode(lPass) + '&sender=' + TIdURI.ParamsEncode(lSender) + '&mobile=' + TIdURI.ParamsEncode(lMobile) + '&message=' + TIdURI.ParamsEncode(lMsg));
  finally
    lHTTP.Free;
  end;
end;

更新406 响应代码意味着服务器无法以基于客户端的Accept... 请求标头(@ 987654326@、Accept-LanguageAccept-Encoding 等),因此请根据 API 的预期和浏览器发送的内容检查您的标头。

【讨论】:

  • 感谢您的及时回复。我已经试过你的代码,但仍然有同样的错误
  • 您能指导如何检查浏览器在标头中发送的语言是什么
  • @Khawar 大多数现代浏览器都有一个内置调试器来捕获 HTTP 请求/响应。否则,由于您使用的是未加密的 HTTP 而不是加密的 HTTPS,您可以使用数据包嗅探器,例如 Wireshark。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多