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

时间:2016-02-12 23:04:26

标签: c++ objective-c httprequest nsurlsessiondatatask

我有一个很长的base64编码文本字符串。它大约有1024个字符。从我的Objective C代码中,我想将它发送到我的PHP脚本,将它转储到日志中,并返回一个" 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');

1 个答案:

答案 0 :(得分:0)

使用普通的C ++有一条更容易的路线。您必须将.m文件转换为.mm文件才能混合使用Objective C和C ++代码。

PHP代码很好,不需要修订。这是我使用的C ++示例。它使用了STL和卷曲。我在Mac上这样做,默认情况下OSX预先安装了curl库。请注意,下面的示例是同步的 - 它会阻止程序执行,直到服务器调用完成。 (在我的情况下我希望这样 - 你可能不会。)

C ++客户端代码(类)

#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