1

在我的应用程序中,我将向远程 Magento 购物车添加一个对象。所以我的应用程序有一个,我可以viewController在其中选择我想要的产品,当我点击该产品时,它会向我展示另一个viewController,我可以在其中阅读产品的详细信息。现在我在其中放了一个按钮viewController来将产品添加到购物车。我在浏览器上尝试了Magento电子商务,我看到当我单击“添加到购物车”按钮时,它会使用以下地址向服务器发送一个 http 请求:

http://54.204.6.246/magento8/checkout/cart/add/uenc/aHR0cDovLzU0LjIwNC42LjI0Ni9tYWdlbnRvOC9zcGVjaWFsLXNhbGVzLmh0bWw,/product/1/form_key/Zqmpp3fnpuTtxI4b/

这样我就将产品放入了远程购物车Magento。现在我想对我的iOS应用程序做同样的事情,所以我写了以下代码:

#import "CreateCarriage.h"
#import "NSData+Base64.h"

@implementation CreateCarriage{
    NSMutableData *datas;
}

- (void)createCarriageWithProductID:(NSString *)productID {

    NSString *addProductLink = [NSString stringWithFormat:@"http://54.204.6.246/magento8/checkout/cart/add/uenc/aHR0cDovLzU0LjIwNC42LjI0Ni9tYWdlbnRvOC9zcGVjaWFsLXNhbGVzLmh0bWw,/product/%@/form_key/Zqmpp3fnpuTtxI4b/", productID];
    [self sendRequestToURL:addProductLink withMethod:@"GET"];
}

- (id)sendRequestToURL:(NSString *)url withMethod:(NSString *)method {
    NSURL *finalUrl;
    if ([method isEqualToString:@"GET"]) {
        finalUrl = [NSURL URLWithString:url];
    } else {
        NSLog(@"Metodo non previsto");
    }
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:finalUrl];
    [request setHTTPMethod:method];
    NSString *authStr = @"user:password";
    NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedString]];
    [request setValue:authValue forHTTPHeaderField:@"Authorization"];
//    [request setValue:@"x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-type"];
    NSLog(@"%@", request);

    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    if (connection) {
        [connection start];
    }
    return connection;
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    datas = [[NSMutableData alloc]init];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
    [datas appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"Oggetto aggiunto al carrello");
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"%@", error);
}

@end

但是当我运行该应用程序时,它会向我显示:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
    <head>
      <title>401 Authorization Required</title>
    </head>
    <body>
     <h1>Authorization Required</h1>
     <p>This server could not verify that you are authorized to access the document requested.  Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.</p>
     <hr>
     <address>Apache/2.2.15 (Red Hat) Server at 54.204.6.246 Port 80</address>
    </body>
</html>

我的代码有什么问题?如果我在正常浏览器上尝试它们,我在代码中设置的用户和密码确实是正确的。

4

1 回答 1

0

Magento 不支持 HTTP 基本身份验证。您在上面使用的 URL 会将 id=1 的产品添加到“当前”用户的购物车中,其中“当前”用户由会话 cookie 标识。您的 iOS 原生应用程序不会维护 cookie,因此即使您解决了 HTTP 身份验证问题,上述代码段也不会起作用。

HTTP 身份验证错误很可能是由于服务器配置/用户名密码不正确造成的。检查您的 Apache 配置 ( http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html )。它在您的浏览器中运行的原因是因为它接受 cookie,因此 Magento 能够维护您的会话。

如果你想验证你的 Magento 客户,你必须使用 Magento 的 API。您可以使用 SOAP API (www.magentocommerce.com/api/soap/introduction.html) 或 REST API (www.magentocommerce.com/api/rest/introduction.html)。

然而,他们都有自己的一系列问题。你可能想看看 MobStac 的 Magento 的 iOS SDK。除了在桌面和移动设备之间同步客户的购物车,它还支持获取目录信息和付款。访问http://developer.mobstac.com/了解更多详情。免责声明:我为 MobStac 工作。

于 2014-06-17T12:59:23.423 回答