这个语法pharos会出现什么问题?

时间:2018-02-06 08:47:21

标签: smalltalk pharo pharo-5

我正在尝试创建一个记录到服务器的方法,抓取它找到的json文件,然后选择每个元素中的4个并将其发送到一个地址。下面的代码似乎可行,当我只为发送链接中的每种格式提供一个已知的数据时,而不是一次应选择每个格式的循环。我得到的错误是:instance of smallInteger did not understand #readStream。导致此错误的原因是什么?我还能如何自动化这些请求?



1 to: 4 do: [ :each |
   each.
   a := ZnClient new.
   a get: 'https://MyServer/'.
   a headerAt: 'referer' put: 'https://MyServer' ;
     formAt: 'email' add: 'myEmail' ;
     formAt: 'password' add: 'MyPass'.
   a post.
   a get: 'https://MyServer/json'.

   data := NeoJSONReader fromString: a contents.
   list := data at: each.
   foo := list at: 'num'.
   poo := list at: 'name'.
				
   a get: 'https://MyServer/copy/', poo.
   a url: 'https://MyServer/send/'.
   a formAt: 'add' add: 'given address' ;
     formAt: 'nb_pic' add: foo ;
     formAt: 'identf' add: poo.

   a post.
   a get: 'https://MyServer/json' ]




2 个答案:

答案 0 :(得分:1)

乍一看,语法没有错 但看起来你没有获得你正在使用的框架的API:你发送getpost消息而不理解他们实际上会执行" http get"和" http post"每次发送它们。

所以,虽然"语法"它自我是好的,你正在做什么非常不正确(我不明白是什么)。看,这就是你的程序的理解方式:

4 timesRepeat: [
    "this will do a post" 
    ZnClient new
        url: 'https://MyServer/';
        headerAt: 'referer' put: 'https://MyServer';
        formAt: 'email' add: 'myEmail';
        formAt: 'password' add: 'MyPass';
        post.

    "this is a simple get"
    a := ZnClient get: 'https://MyServer/json'.
    data := NeoJSONReader fromString: a contents.
    list := data at:each.
    foo := list at:'num'.
    poo := list at:'name'.

    "this is another get that I don't know what's doing here"
    a := ZnClient get: 'https://MyServer/copy/', poo.

    "this is another post"
    a := ZnClient 
        url: 'https://MyServer/send/';
        formAt: 'add' add: 'given address';
        formAt: 'nb_pic' add:foo;
        formAt: 'identf' add: poo;
        post.

    "and finally, this is another get"
    ZnClient get: 'https://MyServer/json' ]

显然,该代码没有按照您的意愿执行:)

答案 1 :(得分:0)

我想通过@Carlo暗示错误消息:smallInteger的实例不理解#readStream是由于从poo和foo收集的值。

    list := data at:each.
    foo := list at:'num'. "Here and integer"
    poo := list at:'name'."Here a byteString"

事实上,表单操作需要一个键和值,如图所示,但是值必须是一个字符串,我只是用poo和foo代替来添加:

    formAt: 'nb_pic' add:foo;
    formAt: 'identf' add: poo;

因此我需要转换foo和poo asString,现在它工作正常。感谢