0

我正在尝试将 xmlrpc 与 wordpress 一起使用来获取特定自定义类型(称为集合)的帖子。

Wordpress API 文档指出:

wp.​​getPosts

Parameters:
int blog_id
string username
string password
struct filter: Optional.
   string post_type
   string post_status
   int number
   int offset
   string orderby
   string order
array fields: Optional.

我的问题是在 objc 中用字符串形成一个结构:

我想做这样的事情:

// in .h

typedef struct{
    string post_type;
    string post_status;
    int number;
    int offset;
    string orderby;
    string order;
} wp_filter;

// in .m

wp_filter filter = {@"collection", @"", ... , ... ,@"",@""};
NSArray *fieldsArray = [NSArray arrayWithObjects:@"post_title", nil];
NSArray *postParams = [NSArray arrayWithObjects:@"0", username, password, filter, fieldsArray, nil];
XMLRPCRequest *reqCollections =[[XMLRPCRequest alloc] initWithURL:[NSURL URLWithString:server]];

[reqCollections setMethod:@"wp.getPosts" withParameters:postParams];

XMLRPCResponse *customPostResponse = [XMLRPCConnection sendSynchronousXMLRPCRequest:reqCollections error:nil];

if ([[customPostResponse object] isKindOfClass:[NSArray class]]){
    NSArray *collections = [NSArray arrayWithArray:[customPostResponse object]];
    NSLog(@"number of collections %i",[collections count]);
    for (int i = 0; i < [collections count]; i++) {
        NSLog(@"%@", [[collections objectAtIndex:i] description] );
    }
}
else {
    NSLog(@"response description %@",[[customPostResponse object ] description]);
}
4

1 回答 1

2

我不了解 XML-RPC WordPress API,但它structs是 C 构造而不是 Cocoa NSObjects,因此您不能将它们嵌入到NSArray.

所以该[NSArray arrayWithObjects:..., filter, ..., nil]行是无效的,因为filter是一个wp_filter结构。

我认为API文档中提到的“结构”更多是一些伪代码来解释数据结构/组织。显然,您需要将该概念“翻译”为 Cocoa 对象。

您可能会尝试将您的 C 结构转换为 anNSArray并以与 API 预期相同的顺序传递参数,或者更有可能将您的结构转换为 an NSDictionary,其键是结构字段的名称,值显然是您的结构的字段值。

此外,要将整数封装到 Cocoa 对象中,您应该使用NSNumber该类而不是将整数转换为NSStrings.


所以这会给出这样的结果:

NSDictionary* filter = [NSDictionary dictionaryWithObjectsAndKeys:
    @"collection", @"post_type",
    @"", @"post_status",
    [NSNumber numberWithInt:number], @"number",
    [NSNumber numberWithInt:offset], @"offset",
    @"", @"orderby",
    @"", @"order",
    nil];
NSArray *postParams = [NSArray arrayWithObjects:
    [NSNumber numberWithInt:0], // blog_id
    username,
    password,
    filter,
    [NSArray arrayWithObject:@"post_title"], // fieldsArray
    nil];

或者,如果您使用允许您使用 Modern Objective-C 的最新 LLVM 编译器,您可以使用更简洁的语法:

NSDictionary* filter = @{
    @"post_type": @"collection",
    @"post_status": @"",
    @"number": @(number)
    @"offset": @(offset)
    @"orderby": @"",
    @"order": @""};
NSArray *postParams = @[ @0, username, password, filter, @[@"post_title"]];

我什至敢打赌,对于您不想在调用中设置的参数,例如"orderby"and"order"参数,您可以跳过键并避免在字典中设置它们。

再一次,我从未使用过 Wordpress XML-RPC API,但据我了解文档,如果这不起作用,解决方案应该非常接近这样的东西(例如,我可能错了,你可能不得不NSArray使用文档中提到的NSDictionary“过滤器”伪结构的一个;您在问题中从文档中引用的内容并不足以说明在通过 Cocoa 使用它时必须使用哪个)。

于 2012-09-16T01:19:27.527 回答