将字符串发布到 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
我有一个很长的 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