purescript的OAUTH
我对Purescript是新手。我正在搜索OAuth客户端并找到了。 我不知道如何构建它,但这是我尝试过的 我已经在我按照《入门指南》创建的第一个项目下复制了源代码。 当Ipurescript的OAUTH,oauth,purescript,Oauth,Purescript,我对Purescript是新手。我正在搜索OAuth客户端并找到了。 我不知道如何构建它,但这是我尝试过的 我已经在我按照《入门指南》创建的第一个项目下复制了源代码。 当I纸浆构建时的第一个错误是 Error 1 of 3: at src\Network\OAuth.purs:138:1 - 138:1 (line 138, column 1 - line 138, column 1) Unable to parse module: expecting indentati
纸浆构建时的第一个错误是
Error 1 of 3:
at src\Network\OAuth.purs:138:1 - 138:1 (line 138, column 1 - line 138, column 1)
Unable to parse module:
expecting indentation past column 1
这是我通过评论出来的,对吗
但我现在越来越紧张了
Error 1 of 3:
at src\Network\OAuth.purs:228:3 - 228:3 (line 228, column 3 - line 228, column 3)
Unable to parse module:
unexpected {
expecting data constructor name
我该如何解决这个问题(假设到目前为止我所做的一切都很好…我也不知道)
我正在查看和的文档,但无法立即发现错误(除了我接下来要写的内容)。特别是,根据语言规则,它似乎是一个正确的记录定义
PureScript记录对应于JavaScript对象。他们可能有
零个或多个命名字段,每个字段都有自己的类型。例如:{name::String,greet::String->String}
对应于
JavaScript对象,正好有两个字段:名称
,它是一个字符串
,
和greet
,该函数接受字符串并返回
字符串
因此,我做了一个实验,在错误之前添加了几行,这是对数据关键字的文档和另一行的外推
上面的两行代码都很好,下面的代码也很好
type Foo a = {foo :: Foo | bar :: Bar a}
所以我想我必须用类型
替换数据
,但这有意义吗?下面的修复似乎有效(但我在github的其他代码文件中有其他错误…)
我的路径是否正确(在Purescript中实现OAuth客户机) 实际上,我会和切克索联系,看看他的想法是什么。该库是在PureScript 0.12之前编写的,因此需要进行大量更改才能兼容
类型
和数据
是两件不同的事情<代码>类型
引入类型同义词(现有类型的另一个名称),而数据
引入代数数据类型(其他类型的有区别的和和和积)
记录也是另外一回事<代码>{a∷ A}
在定义上等同于记录(A∷ A)
第228行未分析,因为缺少构造函数名称<代码>数据X={a∷ A}
是无效语法,并且数据X=Y{A∷ }
是有效的语法
我正在搜索OAuth客户机,找到了这个
您已经发现了一个未完成的项目,而最好的方法是为该项目编写绑定
首先,如果您计划与推特集成,请考虑通过节点运行来检索访问令牌(请注意其中的两个注释)。
然后替换
oauth.get
中的2+2秘密(应用程序和用户密钥),最后将其导出为未复制函数模块
例如,假设您只想输出一些tweet,您可以将log
函数作为有效回调传递
"use strict";
module.exports = {
sayHelloInEnglish: function() {
return "HELLO";
},
logMyTweets: function(callback) {
var OAuth = require('oauth');
var oauth = new OAuth.OAuth(
'https://api.twitter.com/oauth/request_token',
'https://api.twitter.com/oauth/access_token',
'app key',
'app token',
'1.0A',
null,
'HMAC-SHA1'
);
oauth.get(
'https://api.twitter.com/1.1/lists/statuses.json?slug=develop&owner_screen_name=giuliohome_2017&count=2',
//'https://api.twitter.com/1.1/trends/place.json?id=23424977',
'user token',
'user secret',
function (e, data, res){
if (e) console.error(e);
callback (data);
});
}
};
Purescript绑定
现在,按照上面的示例,您将编写一个Purescript绑定(同名,扩展名为.purs,而不是.js)
用例可以是
module Main where
import Prelude
import Effect (Effect)
import Effect.Console (log)
import Twitting
import Data.Function.Uncurried (Fn0, runFn0, Fn1, runFn1)
import Effect.Uncurried (runEffectFn1, mkEffectFn1)
callback :: String -> Effect Unit
callback = log
main :: Effect Unit
main = do
log "Hello sailor!"
log (runFn0 sayHelloInEnglish)
runEffectFn1 logMyTweets (mkEffectFn1 callback)
下一步
当然,现在我们可以继续了
由于我们的程序正在以字符串形式接收JSON
数据,我们可能需要data.Argonaut.Parser
中的jsonParser
函数,它是JavaScript的JSON.parse
的一个非常简单的包装器。
否则,Json
值可以通过FFI引入我们的程序
concat::forall a。可折叠a=>a字符串->字符串
康卡特tt=
foldl(\a x->x“\n”a)”“tt
showText::Object A.Json->String
showText推文=
可能是“无文本”A.stringify(查找“文本”推文)
toJsonObject::A.Json->String
toJsonObject j=
A.caseJsonObject“不是json对象”showText j
transform::Array A.Json->Array String
转换e=映射到JSONObject e
showteets::A.Json->Array String
showTweets推特=
A.caseJsonArray[“非json数组”]转换推文
解析::字符串->字符串
解析j=
(\x->x“\n”j)(\x->concat(showteets x))(jsonParser j)
回调::字符串->效果单位
回调j=do
日志(解析j)
最后,假设我们在服务器端,我们很可能会发布一个web应用程序,使用HTTP服务器,如抱歉坚持一个月前提出的这个问题,但是,作为一个实际问题:有人在purescript上使用(twitter)oauth(可能是服务器端)吗?我没有。我能说的是,在大多数情况下,我不得不编写自己的绑定。web(DOM)包、Argonaut和Foreign可能是唯一的例外。所以我想最好的方法是为
type TokenEndpointSuccessResponse a = { access_token :: a -- See 7.1: Access Token Types
, token_type :: AccessTokenType
, expires_in :: Maybe Seconds -- recommended
, refresh_token :: Maybe RefreshToken
, scope :: Maybe AccessScope
}
"use strict";
module.exports = {
sayHelloInEnglish: function() {
return "HELLO";
},
logMyTweets: function(callback) {
var OAuth = require('oauth');
var oauth = new OAuth.OAuth(
'https://api.twitter.com/oauth/request_token',
'https://api.twitter.com/oauth/access_token',
'app key',
'app token',
'1.0A',
null,
'HMAC-SHA1'
);
oauth.get(
'https://api.twitter.com/1.1/lists/statuses.json?slug=develop&owner_screen_name=giuliohome_2017&count=2',
//'https://api.twitter.com/1.1/trends/place.json?id=23424977',
'user token',
'user secret',
function (e, data, res){
if (e) console.error(e);
callback (data);
});
}
};
module Twitting where
import Data.Unit
import Data.Function.Uncurried (Fn0, Fn1)
import Effect (Effect)
import Effect.Uncurried
foreign import sayHelloInEnglish :: Fn0 String
foreign import logMyTweets :: EffectFn1 (EffectFn1 String Unit) Unit
module Main where
import Prelude
import Effect (Effect)
import Effect.Console (log)
import Twitting
import Data.Function.Uncurried (Fn0, runFn0, Fn1, runFn1)
import Effect.Uncurried (runEffectFn1, mkEffectFn1)
callback :: String -> Effect Unit
callback = log
main :: Effect Unit
main = do
log "Hello sailor!"
log (runFn0 sayHelloInEnglish)
runEffectFn1 logMyTweets (mkEffectFn1 callback)
concat :: forall a. Foldable a => a String -> String
concat tt =
foldl (\a x -> x <> "\n" <> a) "" tt
showText :: Object A.Json -> String
showText tweet =
maybe "no text" A.stringify (lookup "text" tweet)
toJsonObject :: A.Json -> String
toJsonObject j =
A.caseJsonObject "not a json object " showText j
transform :: Array A.Json -> Array String
transform e = map toJsonObject e
showTweets :: A.Json -> Array String
showTweets tweets =
A.caseJsonArray ["not a json array"] transform tweets
parse :: String -> String
parse j =
either (\x -> x <> "\n" <> j) (\x -> concat( showTweets x)) (jsonParser j)
callback :: String -> Effect Unit
callback j = do
log (parse j)