BartonTang的博客


  • 首页

  • 关于

  • 归档

  • 标签

beego 框架搭建和简单http路由请求

发表于 2016-08-04 |

beego 框架搭建和简单http路由请求

闲来无事,学习Go的服务器框架beego。

beego 框架搭建:

先安装Golang,这个不会的可以看http://bartontang.github.io/2016/03/31/Golang-环境配置与安装/
直接github下载bee工具

1
go get github.com/beego/bee

安装完成后可通过bee命令来查看是否安装成功,这里不好的是安装bee工具的时候木有任何进度显示不太科学,成功后如下所示:

OK,接着我们需要在$GOPATH/src目录下new 一个新的project,切记执行bee new YourPorjectName 这个命令的时候必须是在GOPATH/src目录下

工程创建完后直接执行,在工程目录下直接执行

1
bee run

那么服务器就在8080端口启动起来了,如下所示:

这里我把配置表里的8088监控端口打开了,具体的配置文件在 /conf/app.conf 文件里

1
2
3
4
5
6
appname = quickstart
httpport = 8080
runmode = dev
EnableAdmin = true
AdminAddr = "localhost"
AdminPort = 8088

这部分大家可以先忽略~现在服务器已经跑起来了,我们用网页打开http://localhost:8080 就能看到一个beego的页面了。
好,安装就先到这里。接下来我们来看下路由和简单的http请求。

简单http路由请求:

打开/routers/route.go文件

1
2
3
4
5
6
7
8
9
10
11
package routers
import (
"github.com/astaxie/beego"
"quickstart/controllers"
)
func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/test", &controllers.TestController{})
}

这里仿照default增加了一个url并把路由处理映射到TestController中

接下来我们看一下TestController.go中的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package controllers
import (
"github.com/astaxie/beego"
)
type TestController struct {
beego.Controller
}
func (c *TestController) Get() {
c.Data["json"] = map[string]interface{}{"rc": 1,
"msg": "success",
"data": false,
}
c.ServeJSON()
}
func (c *TestController) Post() {
account := c.GetString("account")
password := c.GetString("password")
beego.Info(account)
c.Data["json"] = map[string]interface{}{"rc": 1,
"msg": "success",
"data": map[string]interface{}{
"account": account,
"password": password,
},
}
c.ServeJSON()
}

这里分别对Get和Post都做了处理~Get就直接返回一个Json数据给Client;Post呢则是接收Client传过来的两个Json字段account 和 password 并且将account 和 password再重新发回给Client。
beego.Info(account) 这句话是打印account出来

下面就用swift做个小测试,下面这个是自己封装过的代码,先随便贴下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
let t = NetworkController.shareManager()
t.request(.GET, "http://localhost:8080/test").responseJSON { (resp: Response<AnyObject, NSError>) in
print(resp.request) // original URL request
print(resp.response) // URL response
print(resp.data) // server data
print(resp.result) // result of response serialization
DDLogError(resp.debugDescription)
if let JSON = resp.result.value {
print("JSON: \(JSON)")
let account = JSON.objectForKey("msg")!
print("----------account = \(account)")
}
}
t.request(.POST, "http://localhost:8080/test", parameters: ["account": "13800138000", "password": "123456"]).responseJSON { (resp:Response<AnyObject, NSError>) in
print(resp.request) // original URL request
print(resp.response) // URL response
print(resp.data) // server data
print(resp.result) // result of response serialization
DDLogError(resp.debugDescription)
if let JSON = resp.result.value {
DDLogWarn("JSON: \(JSON)")
}
}

server端结果如下:

这里我们看到我们收到了连个请求,一个Get一个Post而且我们把Post数据中的account打印出来啦~~

client端结果如下:

我们成功的获取了server回给client的json数据。

先写这么多,后面会讲讲怎么将beego部署到阿里云上~!

iOS自定义可预览控件

发表于 2016-06-23 |

iOS自定义可预览控件

iOS的编辑器还是不错的,但是自定义的UI控件如果能够可预览就更加nice了,所见即所得!当然也有些坑和感觉需要完善的地方,但相信Apple会对Storyboard做出持续性的更新和改进。

要做到UI控件可预览那么就需要了解IBDesignable和IBInspectable
新建一个工程,先随便写点代码吧~直接贴在下面了,无非就是一个View的圆角和描边颜色,宽度的设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import UIKit
@IBDesignable class BTCustomView: UIView {
// MARK: setter
@IBInspectable var cornerRadius: CGFloat = 0.0 {
didSet {
self.layer.cornerRadius = cornerRadius
}
}
@IBInspectable var borderColor: UIColor = UIColor.clearColor() {
didSet {
self.layer.borderColor = borderColor.CGColor
}
}
@IBInspectable var borderWidth: CGFloat = 0.0 {
didSet {
self.layer.borderWidth = borderWidth
}
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
}
}

@IBDesignable 表示改类是可被IB预览的
@IBInspectable 表示改属性可在IB编辑器里设置

接下来在Main.storyboard中随便拉一个UIView出来做测试

从上面我们可以看出这样子我们就能够很容易定制一个自己的UI,非常的方便。

如果是Objective-C又是怎么样的呢,下面附上Objective-C的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface CustomView : UIView
@property (nonatomic, assign)IBInspectable CGFloat cornerRadius;
@end
#import "CustomView.h"
@implementation CustomView
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {
return [super initWithCoder:aDecoder];
}
- (void)awakeFromNib {
[super awakeFromNib];
}
- (void)setCornerRadius:(CGFloat)cornerRadius {
_cornerRadius = cornerRadius;
self.layer.cornerRadius = _cornerRadius;
self.layer.masksToBounds = @YES;
}

注意点:
现在还不支持类似NSArray之类的复杂类型,so sad!一定要重写initWithCoder方法
好,先这样希望大家有好的自己定制的UI共同分享,共同学习~!

最近遇见的几个坑SQLite,ViewController,SSH

发表于 2016-05-10 |

最近遇见的几个坑SQLite,ViewController,SSH

最近略忙,不单单是项目,也包括些自己的代码and忙着看一些书,多看看书总是好的,多少会有一些收获。记录下最近遇见的几个坑,防止以后有童鞋也进去了~起码能爬起来。

SQLite

做游戏的时候自己有整理过一个关于excel转sqlite文件的脚本,在游戏领域这个还是很重要的,就是对配置表做一个转换。有个字段叫code,它的值是类似001,002…999 这样子的string在excel里肯定要设置成文本格式,那么问题来了,明明定义了code的类型是string,但是导出后SQLite却把它当做数字,剔除为1, 2…999,这个不是我们想要的,这个时候记得把类型string改为text, 那么世界一切将变得美好。

UIViewController

在iOS开发的时候经常会使用导航栏将ViewController压栈

1
2
[self.navigationController pushViewController:vc animated:YES];

假如有多个ViewController跳转压栈,如果我要回到RootViewController有对应的方法,那假设要回到中间的某一个呢,ViewController1 –> ViewController2 –> ViewController3 –> ViewController4
看如下代码:

1
2
3
4
5
for (UIViewController *controller in self.navigationController.viewControllers) {
if ([controller isKindOfClass:[ViewController2 class]]) {
[self.navigationController popToViewController:controller animated:YES];
}
}

相当于遍历在栈中的ViewController,并用运行时方法判定是不是ViewController2,如果是就pop到这个ViewController

SSH

生成公钥密钥的方法:

1
ssh-keygen -t rsa

生成出两个文件xx.key, xx.key.pub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
barton@bartondeMacBook-Pro:~/Desktop$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/barton/.ssh/id_rsa): barton.key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in barton.key.
Your public key has been saved in barton.key.pub.
The key fingerprint is:
SHA256:4QuQ7/YhFVVhcPhez59ox9nwtoxmvcE1oYZYwSQ3glg barton@bartondeMacBook-Pro.local
The key's randomart image is:
+---[RSA 2048]----+
| oE.o=O=. |
| o . .=+o |
| o o o . |
| o . oo o o .|
| o S. o + +.|
| . o . o o =|
| + o +==|
| . o . =o**|
| . +..=o|
+----[SHA256]-----+

最终生成出两个文件:公钥:barton.key.pub 密钥:barton.key
密钥自己保存,公钥上传server的.ssh里~OK以后就可以直接ssh ip -i xx.key 直接登录server了,不用每次输入密码。

1
2
3
公钥是:barton.key.pub,不要把秘钥给别人
公钥是:barton.key.pub,不要把秘钥给别人
公钥是:barton.key.pub,不要把秘钥给别人

重要的事情说三遍~!

下面是百度出来的一段ssh生成证书的脚本,希望对大家有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env bash
echo "Generating RSA key pair ..."
echo "1024 RSA key: private_key.pem"
openssl genrsa -out private_key.pem 1024
echo "create certification require file: rsaCertReq.csr"
openssl req -new -key private_key.pem -out rsaCertReq.csr
echo "create certification using x509: rsaCert.crt"
openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt
echo "create public_key.der For IOS"
openssl x509 -outform der -in rsaCert.crt -out public_key.der
echo "create private_key.p12 For IOS. Please remember your password. The password will be used in iOS."
openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
echo "create rsa_public_key.pem For Java"
openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
echo "create pkcs8_private_key.pem For Java"
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt
echo "finished."

坑先填到这,以后有遇到再继续填上~!

关于iOS的二维码生成和解析

发表于 2016-04-24 |

关于iOS的二维码生成和解析

在现在的应用App中多多少少都会遇到一个功能,扫描二维码,其实扫出来的就是一个字符串,大家有兴趣可以对一些微信的二维码进行test,写个test project然后将扫描出来的结果用弹窗的形式直观地显示出来。
最近在做的个小东西就包括了扫码,并且需要将一个字符串转成一个UIImage的对象,查找了下网上大神们的blog再看了下Apple的官方文档,其实还算简单。上代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
class QRCodeUtil: NSObject {
/**
识别二维码,返回字符串
- parameter image: 二维码图像
- returns: 二维码字符
*/
static func recognizeQRImage(image: UIImage) -> String{
var temp: Int32 = 1
let orientation = image.imageOrientation
let detector: CIDetector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])
switch orientation{
case .Up:
temp = 1
break
case .Down:
temp = 3
break
case .Left:
temp = 8
break
case .Right:
temp = 6
break
case .UpMirrored:
temp = 2
break
case .DownMirrored:
temp = 4
break
case .LeftMirrored:
temp = 5
break
case .RightMirrored:
temp = 7
break
}
let img = CIImage(CGImage: image.CGImage!, options: [CIDetectorImageOrientation: NSNumber(int: temp)])
let features: [CIFeature]? = detector.featuresInImage(img, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh, CIDetectorImageOrientation: NSNumber(int: temp)])
if( features != nil && features?.count > 0)
{
let feature = features![0]
if feature.isKindOfClass(CIQRCodeFeature)
{
let featureTmp:CIQRCodeFeature = feature as! CIQRCodeFeature
let scanResult = featureTmp.messageString
return scanResult
}
}
return ""
}
/**
生成二维码
- parameter codeType: code类型
- parameter codeString: 字符串
- parameter size: 大小
- parameter qrColor: 二维码的颜色
- parameter bkColor: 二维码的背景颜色
- returns: 图像UIImage
*/
static func createCode(codeType: String, codeString: String, size: CGSize, qrColor: UIColor, bkColor: UIColor )->UIImage?
{
let stringData = codeString.dataUsingEncoding(NSUTF8StringEncoding)
//系统自带能生成的码
// CIAztecCodeGenerator
// CICode128BarcodeGenerator
// CIPDF417BarcodeGenerator
// CIQRCodeGenerator
let qrFilter = CIFilter(name: codeType)
qrFilter?.setValue(stringData, forKey: "inputMessage")
qrFilter?.setValue("H", forKey: "inputCorrectionLevel")
//上色
let colorFilter = CIFilter(name: "CIFalseColor", withInputParameters: ["inputImage":qrFilter!.outputImage!,"inputColor0":CIColor(CGColor: qrColor.CGColor), "inputColor1": CIColor(CGColor: bkColor.CGColor)])
let qrImage = colorFilter!.outputImage;
//绘制
let cgImage = CIContext().createCGImage(qrImage!, fromRect: qrImage!.extent)
UIGraphicsBeginImageContext(size);
let context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, CGInterpolationQuality.None);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGContextGetClipBoundingBox(context), cgImage);
let codeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return codeImage
}
}

使用的时候也很方便,在此就不再赘述了~记录一下代码,enjoy it~!

iOS 关于网络重定向的实现以及相关坑的记录

发表于 2016-04-15 |

iOS 关于网络重定向的实现以及相关坑的记录

之前在项目中遇到个问题,既可以说是坑也可以说是自己对一些非常iOS特性的东西的不了解所导致。记录以备有需要的同学或者自己忘了可以回头看看。

先说下简化后的场景:现在server1提供了一个url让我去打开它,然后用户就在这个html的网页上做操作,然后比如点击某个按键提交一些信息到server1,问题来了,这个时候server1与另一个server2做交互并对url进行多次重定向。。具体更复杂一点,大概就是原来用某个url显示的webview经过url的重定向,而我需要拿到每次重定向的response,这里就出现了最后一个response我拿不到的情形。当然每次的request我可以拿到,那么request的url我也可以拿到,那我手动去请求,但这又不符合应用场景,而且也不太科学。

开始折腾了好一会,也很郁闷,后来发现类似这种情况是必须自己手动去实现NSURLProtocol:

1
2
3
4
@interface RedirectURLProtocol : NSURLProtocol
{
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#import "RedirectURLProtocol.h"
static NSString * const URLProtocolHandledKey = @"URLProtocolHandledKey";
@interface RedirectURLProtocol ()<NSURLConnectionDelegate>
@property (nonatomic, strong) NSURLConnection *connection;
@end
@implementation RedirectURLProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
//只处理http和https请求
NSString *scheme = [[request URL] scheme];
if ( ([scheme caseInsensitiveCompare:@"http"] == NSOrderedSame ||
[scheme caseInsensitiveCompare:@"https"] == NSOrderedSame))
{
//看看是否已经处理过了,防止无限循环
if ([NSURLProtocol propertyForKey:URLProtocolHandledKey inRequest:request]) {
return NO;
}
return YES;
}
return NO;
}
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
NSMutableURLRequest *mutableReqeust = [request mutableCopy];
mutableReqeust = [self redirectHostInRequset:mutableReqeust];
return mutableReqeust;
}
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b
{
return [super requestIsCacheEquivalent:a toRequest:b];
}
- (void)startLoading
{
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
//打标签,防止无限循环
[NSURLProtocol setProperty:@YES forKey:URLProtocolHandledKey inRequest:mutableReqeust];
self.connection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];
}
- (void)stopLoading
{
[self.connection cancel];
}
#pragma mark - NSURLConnectionDelegate
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
NSHTTPURLResponse* tempResponse = (NSHTTPURLResponse*)response;
NSLog(@"============ header = %@", tempResponse.allHeaderFields.allKeys);
}
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.client URLProtocol:self didLoadData:data];
}
- (void) connectionDidFinishLoading:(NSURLConnection *)connection {
[self.client URLProtocolDidFinishLoading:self];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[self.client URLProtocol:self didFailWithError:error];
}
#pragma mark -- private
+(NSMutableURLRequest*)redirectHostInRequset:(NSMutableURLRequest*)request
{
if ([request.URL host].length == 0) {
return request;
}
NSString *originUrlString = [request.URL absoluteString];
NSString *originHostString = [request.URL host];
NSRange hostRange = [originUrlString rangeOfString:originHostString];
if (hostRange.location == NSNotFound) {
return request;
}
// 替换url,现有不需要去重定向不同的url,所以直接将request的urlcopy
NSString *urlString = request.URL.absoluteString;
NSURL *url = [NSURL URLWithString:urlString];
request.URL = url;
return request;
}
@end

这样子我就将会在- (void) connection:(NSURLConnection )connection didReceiveResponse:(NSURLResponse )response这个函数里获得response
在你需要之前加入以下这句话

1
[NSURLProtocol registerClass:[RedirectURLProtocol class]];

用完记得还是把它移除掉,不然你的重定向协议是会一直影响你的App的,直到你自己手动移除掉它。

1
[NSURLProtocol unregisterClass:[RedirectURLProtocol class]];

先记录到这,其实这样子你就可以自己去定制协议定制规则,but最好别这么干吧,需要点功底的感觉。不然自己坑自己的节奏~

1234
Barton

Barton

18 日志
3 标签
GitHub
© 2016 — 2018 Barton