将字符串发布到 Web 服务器,获取响应

Posting String To Web Server, Get Response

我有一个很长的 base64 编码文本字符串。大约有 1024 个字符。从我的 Objective C 代码中,我想将它发送到我的 PHP 脚本,让它转储到日志中,然后 return 返回一个 "OK" 响应。我试过this cookbook example,但它只有一个上传和下载的例子(不是两者都结合),它甚至对我的情况不起作用。

如果我知道怎么做,我愿意将其转换为 C++ 解决方案。

Objective C客户端代码(命令行客户端)

NSString *sMessage = @"My Long Base64 Encoded Message";
NSString *sURL = "http://example.com/request.php";
NSURL *oURL = [NSURL URLWithString:sURL];

NSData *data = [NSData dataWithBytes:sMessage.UTF8String length:sMessage.length];

NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession]
  dataTaskWithURL:oURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    NSLog(@"\n\nDATA\n\n%@",data);
    NSLog(@"\n\nRESPONSE\n\n%@",response);
    NSLog(@"\n\nERROR\n\n%@",error);

}];

[downloadTask resume];

PHP Web 服务器代码

<?php

error_reporting(E_ALL);
ini_set('display_errors','On');
$sRaw = file_get_contents('php://input');
file_put_contents('TEST.TXT',$sRaw);
die('OK');

使用普通 C++ 的方法要简单得多。您必须将 .m 文件转换为 .mm 文件才能混合使用 Objective C 和 C++ 代码。

PHP 代码很好,不需要修改。这是我使用的有效的 C++ 示例。它使用了 STL 和 curl。我在 Mac 上执行此操作,默认情况下 OSX 已预安装 curl 库。请注意,下面的示例是同步的——它会阻塞程序执行,直到服务器调用完成。 (在我的情况下我想要这个——你可能不想要。)

C++ 客户端代码(class)

#pragma once
#include <string>
#include <sstream>
#include <iostream>
#include <curl/curl.h>

class Webby {

public:

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) {
    std::string buf = std::string(static_cast<char *>(ptr), size * nmemb);
    std::stringstream *response = static_cast<std::stringstream *>(stream);
    response->write(buf.c_str(), (std::streamsize)buf.size());
    return size * nmemb;
}

static std::string sendRawHTTP(std::string sHostURL, std::string &sStringData) {

    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();
    if (curl) {
        std::stringstream response;
        curl_easy_setopt(curl, CURLOPT_URL, sHostURL.c_str());
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sStringData.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Webby::write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        return response.str();
    }
    return "";
}

}; // end class