带有 JSON 的 RestKit Post 方法

Posted

技术标签:

【中文标题】带有 JSON 的 RestKit Post 方法【英文标题】:RestKit Post method with JSON 【发布时间】:2013-11-04 20:11:39 【问题描述】:

我正在为学校开发一个 ios 应用程序。 我正在使用数据库,所以我可以稍后运行一些统计数据。 我创建了一个 Restful Web 服务来处理我需要的所有功能,并使用 RestKit 来访问 Web 服务。 当我需要从 WS 检索数据时,我没有任何问题,但是当我需要发布信息时,我遇到了一些错误,如果可以的话,我希望得到一些帮助。

我在 WS 中创建的 POST 方法是用于向 DB 添加一个新的 Collection,它没有返回,只是添加它。我正在使用 GSON 库从 JSON 转换。我用 netbeans 的“测试器”进行了测试,效果很好,所以我猜问题不在 Web 服务上。我将把所涉及的类的代码和尝试发布对象的方法放在一起。

我有这个类:收藏

#import <Foundation/Foundation.h>
#import "User.h"
@interface Collection : NSObject
@property NSNumber *idCollection;
@property NSString *name;
@property User *user;
@property NSArray *collectionItens;
@end

还有这个类:用户

#import <Foundation/Foundation.h>
@interface User : NSObject
@property NSNumber *idUser;
@property NSString *login;
@property NSString *password;
@end

两个类都只有@syntezise

这是我尝试发布对象的方法:

- (IBAction)createNewCollection:(id)sender

NSLog(@"..");
Collection *collection = [[Collection alloc] init];
collection.name = collectionNameTextField.text;
collection.user = [AppDefauts defaultUser];

RKObjectMapping *userMapping = [RKObjectMapping requestMapping];
[userMapping addAttributeMappingsFromArray:@[ @"idUser", @"login", @"password"]];

RKObjectMapping *collectionMapping = [RKObjectMapping requestMapping];
[collectionMapping addAttributeMappingsFromArray:@[ @"idCollection", @"name"]];

[collectionMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"user" toKeyPath:@"user" withMapping:userMapping]];



RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:collectionMapping objectClass:[Collection class] rootKeyPath:@"collection" method:RKRequestMethodAny];


RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://localhost:8080/MTGAppWS/webresources"]];
[objectManager addRequestDescriptor:requestDescriptor];

[objectManager postObject:collection path:@"/Collection"    parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
    NSLog(@"Success");

 failure:^(RKObjectRequestOperation *operation, NSError *error) 
    NSLog(@"Error");
];

Xcode 上的日志显示错误:

http://pastebin.com/JXCYzF8B

用于包含新集合的 Web 服务代码

@Path("Collection")
public class CollectionService


@Context
private UriInfo context;

/**
 * Creates a new instance of CollectionService
 */
public CollectionService()


@PUT
@Consumes("application/json")
public void createNewCollection(String content)

    CollectionController c= new CollectionController(new SQLController());
    Gson gson = new Gson();
    JsonParser parser = new JsonParser();
    parser.parse(content);
    Collection collection = gson.fromJson(content, Collection.class);
    c.criarNovaCollection(collection);


编辑

发现请求没有“去”到正确的地址。

已经解决了这个问题,但现在又发生了另一个错误。 (不允许的方法)。

错误信息:http://pastebin.com/99FiNmQZ

【问题讨论】:

服务器期望接收什么?您是否使用 Charles 来查看您实际发送的内容? 对不起,我不知道查尔斯是。服务器需要一个 json 字符串。我将发布处理此部分的代码。 感谢 Wain 对 Charles 的建议。安装它,我认为请求将发送到错误的地址。 RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"localhost:8080/MTGAppWS/webresources"]]; 不知道为什么,但是 URL 忽略了“MTGAppWS/webresources”部分。所以当应用程序请求时,请求的地址是“ 192.168.0.200:8080/Collection"。现在我解决了它,但它现在显示一个不同的错误 【参考方案1】:

您正在与之通信的服务器正在给您一个 html 错误页面,而不是您期望的 JSON:The requested resource () is not available. 错误不在您的应用程序中(除非您请求的 URL 错误);它在服务器上。

【讨论】:

实际上,我并不期待 JSON。该方法没有回报。不确定它是否是最好的设计,但它应该可以工作。我将发布Web Service这部分的代码。它是用 Java 编写的。

以上是关于带有 JSON 的 RestKit Post 方法的主要内容,如果未能解决你的问题,请参考以下文章

Post Json Restkit 无法为 HTTP 方法“POST”类型的对象找到可路由路径

在 POST JSON RestKit 中检索 null

带有数组映射的restkit嵌套对象

Rails RestKit POST 请求 json 的根类丢失

使用 RestKit 发送 POST 不会返回 JSON 内容

使用 RESTKit 做一个简单的 json POST